dokumentaatio
Yhdistäminen

Google GenAI SDK

Markdown

Geminin oma muoto: Google GenAI SDK Pythonille ja JavaScriptille sekä suorat REST-pyynnöt.

Koko opas

Asennus

pip install google-genai

Yhdistäminen

Osoite on https://api.ailoot.ai ilman /v1beta: SDK muodostaa polun /v1beta/models/<malli>:generateContent itse. Pythonissa osoite annetaan kentällä HttpOptions(base_url=…), JavaScriptissä kentällä httpOptions.baseUrl. SDK lähettää avaimen otsakkeessa 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"),  # ilman /v1beta-osaa
)

resp = client.models.generate_content(
    model="gemini-3.8-flash",
    contents="Keksi kolme nimeä kahvilalle.",
)
print(resp.text)

Mitä voi lähettää

  • Ylimmän tason kentät: contents, systemInstruction, generationConfig, safetySettings, tools ja toolConfig.
  • generationConfig hyväksyy temperature, topP, topK, maxOutputTokens, thinkingConfig, responseMimeType (text/plain tai application/json), responseSchema tai responseJsonSchema (JSON-objekti), stopSequences (merkkijonotaulukko), candidateCount: 1, kokonaislukuarvo seed, numeeriset arvot presencePenalty ja frequencyPenalty. Sallitut vaihteluvälit ja ominaisuudet riippuvat kyseisestä mallista; valitse JSON-vastaukseen yksi tuettu skeemamuoto ja application/json. Tekstimalleilla responseModalities on vain ["TEXT"].
  • safetySettings — objektitaulukko, jonka alkioissa on category, threshold ja valinnainen method; valitse arvot kyseisen mallin dokumentaation mukaan.
  • Gemini-malleilla, jotka tukevat kyseistä syötettä, parts[].inlineData sisältää mimeType ja ei-tyhjät base64-tiedot; PDF:n on oltava aito PDF. fileData sisältää julkisen https-osoitteen kentässä fileUri ja tiedoston MIME-tyypin. YouTubessa MIME voidaan jättää määrittämättä. http, yksityisiä osoitteita, gs:// ja Google Files API -objekteja ei tueta, eikä myöskään lataamista Google Files API:n kautta. Videoon voi lisätä videoMetadata: startOffset/endOffset merkkijonona sekunteina (esimerkiksi 1.5s) ja fps arvolla, joka on suurempi kuin 0 ja enintään 24. Pyynnön rungon koko, konteksti, sallittu syöte ja vastausraja tarkistetaan mallin ja muodon perusteella.
  • Asiakkaan functionDeclarations suorittaa oma sovelluksesi. Tekstimalleilla hyväksytään myös {"googleSearch": {}} ja {"urlContext": {}}: erikseen tai yhdessä taulukossa tools. Google Searchia tai URL contextia ei voi yhdistää kenttään nimeltä functionDeclarations samassa pyynnössä. Kuvatulosteille ovat saatavilla vain asiakkaan funktiot. Muita sisäänrakennettuja työkaluja tai eksplisiittistä välimuistia ei tueta. Search/URL context voivat vaatia varauksen koko syöterajan mukaan; toteutunut toolUsePromptTokenCount lasketaan syötetokeneiksi.
  • Jos malli ei tue kenttää, liitettä tai työkaluyhdistelmää, pyyntö hylätään ennen varausta — mitään ei veloiteta. HTTP-statuskoodi on 400 ja vastauksessa on status INVALID_ARGUMENT ja virheluokka invalid_request (kentässä ErrorInfo.reason — INVALID_REQUEST). Virheellinen JSON, polkuparametrien virheet ja muut tarkistusvirheet palauttavat myös 400; lue virheteksti ja Request ID. Ominaisuudet riippuvat mallista: tarkista sen muodot ja syötteet luettelosta.
SyöteTuetut MIME-tyypit
Inline-kuvatimage/png, image/jpeg, image/webp
Asiakirjatapplication/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
Ääniaudio/wav, audio/mp3, audio/mpeg, audio/aiff, audio/aac, audio/ogg, audio/flac
Videovideo/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"},
    )
    # Lähetä vain kerran. Tarkista aikakatkaisun jälkeen Request ID käyttöhistoriastasi ennen kuin yrität uudelleen.
    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

# Anna oikea paikallinen PDF-, ääni- tai videotiedosto ja sen tuettu MIME-tyyppi.
path, mime = pathlib.Path(sys.argv[1]), sys.argv[2]
payload = {"contents": [{"role": "user", "parts": [
    {"text": "Kuvaile lyhyesti tiedoston sisältö."},
    {"inlineData": {"mimeType": mime,
                    "data": base64.b64encode(path.read_bytes()).decode()}},
]}]}
print(generate("gemini-3.8-flash", payload))
# Vaihtoehtoinen liite: {"fileData": {"mimeType": mime, "fileUri": public_https_url}}
# Oikealle YouTube-URL-osoitteelle: {"fileData": {"fileUri": youtube_url}}

Funktion koko kierros

Lähetä määrittely, vastaanota functionCall, suorita oma funktiosi, palauta functionResponse ja pyydä seuraava vastaus. Säilytä mallin koko content, thoughtSignature mukaan lukien; älä luo allekirjoitusta itse.

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"},
    )
    # Lähetä vain kerran. Tarkista aikakatkaisun jälkeen Request ID käyttöhistoriastasi ennen kuin yrität uudelleen.
    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": "Kerro kaksi lukua keskenään",
    "parameters": {"type": "object", "properties": {
        "a": {"type": "number"}, "b": {"type": "number"}},
        "required": ["a", "b"]},
}]}]
contents = [{"role": "user", "parts": [{"text": "Kerro 7 luvulla 8 funktion avulla"}]}]
for turn in range(4):  # Rajoita työkalusilmukan toistot; älä lähetä uudelleen pyyntöä, jonka tulos on epäselvä.
    reply = generate("gemini-3.8-flash", {"contents": contents, "tools": tools})
    content = reply["candidates"][0]["content"]
    contents.append(content)  # Säilytä KAIKKI alkuperäiset osat ja thoughtSignature muuttumattomina.
    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")

Suoratoistovastaus

for chunk in client.models.generate_content_stream(
    model="gemini-3.8-flash",
    contents="Kuvaile auringonlaskua meren yllä",
):
    print(chunk.text, end="", flush=True)

Saatavilla olevat mallit

Gemini-muodossa on saatavilla 27 tunnistetta: 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-mallit ovat saatavilla myös Anthropic Messages -muodossa — kätevää asiakkaille, jotka tukevat vain sitä: Anthropic SDK.

Onko vielä kysyttävää? Lähetä Request ID ja kuvaus — autamme selvittämään asian.Ota yhteyttä tukeen