dokumentasi
Koneksi

Google GenAI SDK

Markdown

Format asli Gemini: SDK Google GenAI untuk Python dan JavaScript serta permintaan REST langsung.

Panduan lengkap

Instalasi

pip install google-genai

Koneksi

Alamat — https://api.ailoot.ai tanpa /v1beta: SDK menyusun jalur /v1beta/models/<model>:generateContent secara otomatis. Dalam Python, alamat diatur melalui HttpOptions(base_url=…), dalam JavaScript — melalui httpOptions.baseUrl. SDK mengirim kunci melalui 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"),  # tanpa /v1beta
)

resp = client.models.generate_content(
    model="gemini-3.8-flash",
    contents="Buat tiga nama untuk kedai kopi.",
)
print(resp.text)

Yang dapat dikirim

  • Kolom tingkat atas: contents, systemInstruction, generationConfig, safetySettings, tools dan toolConfig.
  • generationConfig menerima temperature, topP, topK, maxOutputTokens, thinkingConfig, responseMimeType (text/plain atau application/json), responseSchema atau responseJsonSchema (objek JSON), stopSequences (array string), candidateCount: 1, bilangan bulat seed, nilai numerik presencePenalty dan frequencyPenalty. Rentang yang diizinkan dan fitur bergantung pada model yang tepat; untuk respons JSON, pilih satu bentuk skema yang didukung dan application/json. Untuk model teks responseModalities — hanya ["TEXT"].
  • safetySettings — array objek dengan category, threshold dan kolom opsional method; pilih nilai sesuai dokumentasi model yang tepat.
  • Untuk model Gemini yang mendukung jenis input tersebut, parts[].inlineData berisi mimeType dan data base64 yang tidak kosong; PDF harus berupa file PDF yang valid. fileData berisi alamat publik httpsdi fileUri dan MIME jenis file. Untuk YouTube, MIME boleh tidak diisi. http, alamat privat, gs:// dan objek Google Files API tidak didukung, begitu pula unggahan melalui Google Files API. Untuk video, Anda dapat menambahkan videoMetadata: startOffset/endOffset sebagai string dalam detik (misalnya, 1.5s) dan fps lebih dari 0 dan tidak lebih dari 24. Ukuran isi permintaan, konteks, input yang diizinkan, dan batas respons diperiksa berdasarkan model dan format.
  • Deklarasi fungsi klien functionDeclarations dijalankan oleh aplikasi Anda. Model teks juga menerima {"googleSearch": {}} dan {"urlContext": {}}: secara terpisah atau bersama-sama dalam array tools. Google Search maupun URL context tidak dapat digabungkan dengan functionDeclarations dalam satu permintaan. Untuk output gambar, hanya fungsi klien yang tersedia. Alat bawaan lainnya dan explicit cache tidak didukung. Search/URL context dapat memerlukan saldo yang ditahan berdasarkan batas input penuh; nilai aktual toolUsePromptTokenCount dihitung sebagai token input.
  • Jika model tidak mendukung kolom, lampiran, atau kombinasi alat, permintaan ditolak sebelum dana ditahan — tidak ada pendebitan. Respons berupa HTTP 400 dengan status INVALID_ARGUMENT dan kelas invalid_request (di ErrorInfo.reason — INVALID_REQUEST). JSON yang tidak valid, kesalahan parameter jalur, dan kegagalan validasi lainnya juga mengembalikan 400; baca pesan kesalahan dan Request ID. Fitur bergantung pada model: periksa format dan inputnya di katalog.
InputMIME yang didukung
Gambar inlineimage/png, image/jpeg, image/webp
Dokumenapplication/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
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"},
    )
    # Kirim sekali saja. Jika batas waktu terlampaui, periksa Request ID di riwayat penggunaan sebelum mencoba lagi.
    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

# Sediakan berkas PDF, audio, atau video lokal yang nyata beserta jenis MIME yang didukung.
path, mime = pathlib.Path(sys.argv[1]), sys.argv[2]
payload = {"contents": [{"role": "user", "parts": [
    {"text": "Jelaskan isi berkas secara singkat."},
    {"inlineData": {"mimeType": mime,
                    "data": base64.b64encode(path.read_bytes()).decode()}},
]}]}
print(generate("gemini-3.8-flash", payload))
# Lampiran alternatif: {"fileData": {"mimeType": mime, "fileUri": public_https_url}}
# Untuk URL YouTube yang nyata: {"fileData": {"fileUri": youtube_url}}

Siklus lengkap fungsi

Kirim deklarasi, terima functionCall, jalankan fungsi Anda, kembalikan functionResponse, lalu minta respons berikutnya. Pertahankan seluruh content model, termasuk thoughtSignature; jangan buat tanda tangan sendiri.

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"},
    )
    # Kirim sekali saja. Jika batas waktu terlampaui, periksa Request ID di riwayat penggunaan sebelum mencoba lagi.
    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": "Mengalikan dua bilangan",
    "parameters": {"type": "object", "properties": {
        "a": {"type": "number"}, "b": {"type": "number"}},
        "required": ["a", "b"]},
}]}]
contents = [{"role": "user", "parts": [{"text": "Kalikan 7 dengan 8 menggunakan fungsi"}]}]
for turn in range(4):  # Batasi pengulangan pemanggilan alat; jangan kirim ulang permintaan yang hasilnya belum jelas.
    reply = generate("gemini-3.8-flash", {"contents": contents, "tools": tools})
    content = reply["candidates"][0]["content"]
    contents.append(content)  # Pertahankan semua (ALL) bagian asli dan thoughtSignature tanpa perubahan.
    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")

Respons streaming

for chunk in client.models.generate_content_stream(
    model="gemini-3.8-flash",
    contents="Gambarkan matahari terbenam di atas laut",
):
    print(chunk.text, end="", flush=True)

Model yang tersedia

Dalam format Gemini tersedia 27 ID: 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.

Model Gemini juga tersedia dalam format Anthropic Messages — praktis untuk klien yang hanya mendukungnya: Anthropic SDK.

Masih ada pertanyaan? Kirim Request ID dan penjelasannya — kami akan membantu.Hubungi dukungan