Lewati ke konten utama

Tutorial API Gemini 3.8 Flash: Thinking Level, Ekstraksi PDF, dan Function Calling di Python

Pelajari cara menggunakan API Gemini 3.8 Flash di Python: penyiapan Interactions API, penyetelan thinking_level, ekstraksi PDF-ke-JSON, dan pemanggilan fungsi dengan kode.
Diperbarui 7 Sep 2026  · 15 mnt baca

Jelajahi dengan AI

ChatGPTClaudePerplexity

Google merilis 3 model Flash dalam 6 minggu: 3.6 di akhir Juli, lalu 3.7 Flash pada 13 Agustus, dan kini Gemini 3.8 Flash pada 2 September 2026. Jika Anda datang dari 3.7, pembaruannya hanya 1 baris, karena permukaan API-nya identik. Konfigurasi yang lebih lama dari itu tetap akan gagal jika Anda tidak menyesuaikan parameternya.

Alih-alih menambal kode lama, tutorial ini membangun penyiapan bersih dari nol. Kita akan menginisialisasi klien Python pada Interactions API, membandingkan 3 tingkat penalaran pada tugas debugging praktis dengan hitungan token nyata, mengekstrak JSON yang rapi sesuai skema dari faktur PDF, dan mengimplementasikan loop pemanggilan fungsi yang lengkap. Terakhir, kita akan membahas daftar periksa migrasi bagi pengembang yang meningkatkan dari 3.6 Flash atau sebelumnya.

Untuk mengikuti, Anda memerlukan Python 3.10+ dan kunci API Google AI Studio. Panduan ini berfokus pada implementasi kode alih-alih pengumuman fitur.

Ringkasnya

  • Gemini 3.8 Flash (gemini-3.8-flash) menggunakan Interactions API melalui client.interactions.create() di SDK google-genai

  • Kedalaman penalaran diatur menggunakan nilai string (thinking_level: low, medium, high). 

  • Opsi sampling lama (temperature, top_p, top_k) sudah tidak berlaku 

  • Status multi-giliran dikelola di sisi server menggunakan previous_interaction_id

  • Harga perkenalan adalah $0,75 / $3,75 per satu juta token input/output hingga 31 Desember 2026. 

  • Jika berasal dari 3.7 Flash, hanya string model yang berubah.

Apa Itu Gemini 3.8 Flash?

Gemini 3.8 Flash adalah model andalan Google, tersedia umum sejak 2 September 2026, dengan ID model gemini-3.8-flash. Model ini hadir 3 minggu setelah 3.7 Flash, dan diposisikan Google untuk penulisan kode horizon panjang, alur kerja agentic, dan penalaran multilangkah di domain khusus seperti keuangan dan pekerjaan hukum.

Spesifikasi yang penting untuk panggilan API tidak berubah dari 3.7: 

  • jendela konteks 1 juta token
  • maksimal 64k token output
  • input multimodal (teks, gambar, video, audio, PDF) dengan output teks
  • Harga perkenalan yang sama $0,75 per 1M token input dan $3,75 per 1M token output hingga 31 Desember 2026 (naik menjadi $1,50 dan $7,50 mulai 1 Januari 2027)

Yang berubah adalah perilaku, bukan permukaan: Google mengatakan 3.8 bekerja lebih keras pada tugas kompleks, mengambil langkah penalaran ekstra dan memanggil alat secara iteratif, yang dapat menaikkan penggunaan token pada tingkat upaya yang lebih tinggi. 3.7 Flash tetap sepenuhnya didukung untuk beban kerja di mana efisiensi lebih penting daripada kedalaman.

Untuk tolok ukur dan rincian harga, lihat panduan Gemini 3.8 Flash kami, atau baca panduan What is Google Gemini? untuk gambaran platform.

Gemini 3.8 Flash vs. 3.8 Flash Cyber

Peluncuran ini mencakup 2 varian, dan hanya 1 yang memiliki ID model yang bisa Anda ketik. 

  • Gemini 3.8 Flash adalah model umum, tersedia di Google AI Studio dan Gemini API saat ini. 
  • Gemini 3.8 Flash Cyber adalah varian keamanan siber yang disetel untuk penemuan kerentanan dan patching otomatis.

Varian Cyber tidak tersedia di API publik: akses melalui Fairwind Program Google, yang dibatasi untuk otoritas pemerintah yang disetujui, operator infrastruktur kritis, dan pemelihara perangkat lunak.

Jika Anda mengikuti tutorial ini, ID model Anda adalah gemini-3.8-flash. Tidak ada bagian di bawah yang membutuhkan atau menggunakan varian Cyber.

Interactions API vs. generateContent

Untuk memanggil Gemini 3.8 Flash, gunakan client.interactions.create() di SDK google-genai. Google menjadikan Interactions API GA pada Juni 2026 dan merekomendasikannya untuk semua pekerjaan baru. Meski generateContent masih berfungsi, itu kini bersifat legacy. Fitur baru seperti riwayat sisi server, eksekusi latar belakang, dan langkah eksekusi yang dapat diamati hadir lebih dulu di Interactions.

Perubahan terbesar dalam praktik adalah manajemen status. Panggilan multi-giliran kini menggunakan previous_interaction_id di sisi server: Anda mengoper ID interaksi terakhir, dan server menangani pemulihan status. Anda tidak lagi perlu menambahkan atau mengirim ulang seluruh riwayat percakapan secara manual dari klien. Hindari juga mem-prefill giliran model; itu pola legacy generateContent dan akan gagal di Gemini 3.x.

Satu hal yang sering menjebak, dan akan muncul lagi di bagian PDF: previous_interaction_id hanya memulihkan riwayat percakapan dan tidak lain. tools, system_instruction, generation_config, dan response_format bersifat ruang lingkup interaksi, jadi setiap giliran yang membutuhkannya harus mengoper lagi.

thinking_level menggantikan tombol sampling

Pada model Gemini lama, pengembang menggunakan temperature, top_p, dan top_k untuk mengontrol keacakan output. Gemini 3.x menghapus tombol sampling ini dan menggantinya dengan thinking_level, yang kini menjadi satu-satunya pengatur.

Parameter ini menerima 3 nilai:

  • low: token penalaran paling sedikit, tercepat dan termurah. Cocok untuk ekstraksi, klasifikasi, dan apa pun yang akan Anda cek sendiri.

  • medium: default, dan rekomendasi Google untuk kode dan pekerjaan agen.

  • high: anggaran penalaran terbesar, untuk logika multilangkah yang sulit dan tugas yang berat alat.

Jangan kirim minimal. Nilai ini tidak valid sejak Gemini Flash 3.7 dan mengembalikan error validasi 400. 

Aturan lain yang berlanjut dari 3.7: frequency_penalty, presence_penalty, dan candidate_count kini memunculkan error API aktif, jadi hapus juga dari konfigurasi lama.

Bagaimana Menyiapkan API Gemini 3.8 Flash?

Menyiapkan lingkungan Anda memakan waktu sekitar 2 menit. Anda memerlukan kunci API dari Google AI Studio dan pustaka Python google-genai yang diperbarui.

Dapatkan kunci API dari Google AI Studio

Kunjungi Google AI Studio di perangkat peramban Anda dan masuk dengan akun Google Anda. Klik Create API Key, pilih atau buat proyek Google Cloud, dan salin string kunci rahasia Anda. 

Membuat kunci API Google AI Studio

Buka terminal Anda dan simpan kunci tersebut sebagai variabel lingkungan dengan export GEMINI_API_KEY=<your-key>.

Jangan pernah mengoper kunci sebagai parameter kueri ?key= dalam URL; string kueri berakhir di log server, riwayat peramban, dan cache proxy. Jika Anda ingin menjelajahi model di playground sebelum menulis kode, Tutorial Google AI Studio membahas mode Chat, Build, dan Stream; artikel ini tetap pada API.

Untuk sistem produksi, cerita autentikasi berubah: Vertex AI (kini bagian dari Gemini Enterprise Agent Platform) memberi Anda OAuth, peran IAM, dan endpoint regional alih-alih kunci API mentah. Semua di tutorial ini menggunakan kunci AI Studio karena itu jalur tercepat untuk belajar, tetapi rencanakan migrasi Vertex sebelum apa pun menyentuh data pengguna nyata.

Instal google-genai dan buat klien

Banyak tutorial masih menyarankan menginstal google-generativeai. Itu SDK lama, dan tidak memiliki Interactions API. Instal google-genai (versi 2.3.0 atau lebih baru):

pip install -U google-genai

Setelah terpasang, verifikasi bahwa Python memuat pustaka dan menginisialisasi klien Anda tanpa error:

from google import genai # reads GEMINI_API_KEY from the environment
client = genai.Client() 
print("Client initialized successfully.")

Lakukan panggilan Interactions API pertama Anda

Setiap permintaan ke Interactions API membuat resource Interaction, yang merekam giliran penuh: input Anda, pemikiran model, panggilan alat apa pun, dan output akhir. SDK mengekspos teks akhir melalui properti kemudahan output_text, jadi Anda jarang perlu menelusuri langkah-langkah secara manual.

from google import genai
client = genai.Client()
interaction = client.interactions.create(
    model="gemini-3.8-flash",
    input=(
        "Write a pandas one-liner that adds a 7-day rolling average "
        "revenue column per store_id to a DataFrame with columns "
        "date, store_id, revenue. Reply with only the code, no explanation."
    ),
    generation_config={"thinking_level": "medium"},
)
print(interaction.output_text)
usage = interaction.usage
print(
    f"input={usage.total_input_tokens} | output={usage.total_output_tokens} | "
    f"thinking={usage.total_thought_tokens} | total={usage.total_tokens}"
)

Di mesin saya, model menjawab dengan satu baris pandas berantai, dan baris penggunaan ini:

Lakukan panggilan Interactions API pertama dengan Gemini Flash 3.8

Angka-angka tersebut menyembunyikan perbedaan nyata pertama dari 3.7. Saya menjalankan tugas yang sama lagi dengan prompt lebih panjang dan tanpa pembatasan output, dan 3.8 menghabiskan 1.436 token pemikiran melawan 870 token output. Dengan pembatasan, ia menghabiskan 1.515 melawan 42. Anggaran penalaran hampir tidak bergerak, yang berlawanan dengan 3.7, di mana 2 prompt yang sama mengayunkan pemikiran dari 838 ke 1.530.

Dengan kata lain, 3.8 memutuskan seberapa keras untuk berpikir berdasarkan tugasnya, bukan bagaimana Anda merumuskannya, yang sesuai dengan klaim Google bahwa model secara sengaja bernalar dan memverifikasi lebih banyak. Token penalaran ditagih pada tarif output, jadi pada panggilan yang dibatasi, sekitar 97% token yang ditagih adalah penalaran yang tidak pernah saya lihat. Itulah alasan bagian berikutnya ada. 

Stream respons

Untuk antarmuka chat atau apa pun yang dilihat orang, menunggu beberapa detik untuk respons penuh terasa lambat. Oper stream=True ke client.interactions.create() dan cetak potongan saat tiba:

	from google import genai

	client = genai.Client()

	stream = client.interactions.create(
	   model="gemini-3.8-flash",
	   input="Explain the difference between a JOIN and a correlated subquery in SQL.",
	   generation_config={"thinking_level": "low"},
	   stream=True,
	)

	for event in stream:
	   if event.event_type == "step.delta" and event.delta.type == "text":
	       print(event.delta.text, end="", flush=True)
	print() 

Saat saya menjalankannya, model mengembalikan jawaban panjang yang tertata rapi pada thinking_level: "low": perbandingan konseptual, tabel ringkasan, dan 2 contoh SQL untuk menemukan pesanan terbaru tiap pelanggan, 1 dengan derived-table join dan 1 dengan subkueri berkorelasi di daftar SELECT. Kata-kata pertama muncul hampir seketika, itulah intinya.

Pemanggilan print() terakhir itu ada alasannya. Tanpanya, potongan terakhir berakhir di tengah baris, dan zsh menampilkan tanda % nyasar sebelum prompt Anda, karena stream berhenti persis di tempat teks model berhenti. Juga, delta membawa teks hanya jika Anda mencatat jumlah token per permintaan, bacalah dari event penyelesaian akhir alih-alih menjumlahkan potongan.

Bagaimana thinking_level Mengubah Biaya dan Kualitas?

thinking_level menentukan seberapa banyak penalaran yang dilakukan Gemini 3.8 Flash sebelum menulis jawaban. Token penalaran ditagih pada tarif output $3,75 per 1M, jadi level yang Anda pilih secara langsung mengontrol biaya dan latensi, dan Google mengatakan 3.8 memang sengaja memanfaatkan ini: ia mengambil langkah penalaran ekstra pada tugas kompleks dan mungkin menghabiskan lebih banyak token pada tingkat upaya lebih tinggi daripada 3.7.

Jalankan satu prompt pada level low, medium, dan high

Tesnya adalah kondisi race pada fungsi pembayaran-ulang yang dikirim dengan prompt yang sama di ketiga level. Bug konkurensi menghukum baca-sepintas, jadi jika level berbeda, di sinilah itu akan terlihat. Jika Anda hanya menjalankan 1 blok kode dari artikel ini, jalankan yang ini, karena angka-angka berbicara lebih baik daripada prosa apa pun.

import time

from google import genai

client = genai.Client()

BUGGY_CODE = '''
import threading

payment_attempts = {}

def retry_payment(order_id, charge_fn, max_retries=3):
    """Retry a failed payment up to max_retries times."""
    if order_id not in payment_attempts:
        payment_attempts[order_id] = 0

    while payment_attempts[order_id] < max_retries:
        success = charge_fn(order_id)
        if success:
            del payment_attempts[order_id]
            return True
        payment_attempts[order_id] += 1
    return False
'''

PROMPT = (
    "Two worker threads can call retry_payment() with the same order_id "
    "at the same time. Identify the concurrency bug that can double-charge "
    "a customer, and rewrite the function to fix it.\n\n" + BUGGY_CODE
)

for level in ["low", "medium", "high"]:
    start = time.perf_counter()
    interaction = client.interactions.create(
        model="gemini-3.8-flash",
        input=PROMPT,
        generation_config={"thinking_level": level},
    )
    elapsed = time.perf_counter() - start
    usage = interaction.usage
    print(f"\n=== thinking_level: {level} | {elapsed:.1f}s ===")
    print(interaction.output_text)
    print(
        f"input={usage.total_input_tokens} | output={usage.total_output_tokens} | "
        f"thinking={usage.total_thought_tokens}"
    )

Sebagai konteks, kerentanannya adalah non-atomic check-then-act pada payment_attempts[order_id]. Dalam konkurensi, 2 thread dapat sama-sama melewati kondisi while, dan sama-sama memanggil charge_fn() sebelum salah satunya menambah penghitung. Perbaikannya berarti membungkus alur baca-cek-kenakan-tingkatkan dalam lock per-order, atau menggunakan kunci idempoten di gateway.

Membandingkan hasil

Hasil dari run saya:

thinking_level

Race tertangkap?

Perbaikan benar?

Desain perbaikan

Latensi

Token penalaran

Token output

Biaya

low

Ya

Ya

Lock per-order + himpunan completed

7,8 dtk

0

791

$0,0031

medium

Ya

Ya

Lock per-order + dict status per-order

16,6 dtk

3.158

627

$0,0143

high

Ya

Ya

Rekaman per-order (lock, attempts, completed) dengan jalur gagal terdokumentasi

25,5 dtk

4.512

896

$0,0204

Semua 3 level menemukan double-charge, dan ketiganya menerapkan locking per-order, sehingga pesanan yang tidak terkait berjalan paralel. Bagian kedua ini adalah sorotan jika Anda membandingkan ini di 3.7: di sana, low membungkus semuanya dalam 1 global lock yang dipegang selama panggilan jaringan, dan lock per-order baru muncul di medium. Pada 3.8, low menulis desain yang lebih baik itu pada 0 token penalaran, dalam 7,8 detik, kurang dari sepertiga sen.

Jadi apa yang dibeli level sekarang? Kedalaman audit. Kode ini memiliki 4 mode kegagalan berbeda (double-charge, KeyError pada delete bersamaan, penagihan ulang setelah jalur sukses menghapus status, dan increment penghitung yang non-atomik), dan high adalah satu-satunya level yang menyebut keempatnya; low melewatkan kasus penagihan ulang, dan medium melewatkan penghitung. 

high juga satu-satunya yang merinci semantik jalur gagal dari perbaikannya: setelah upaya habis, pemanggil berikutnya mendapatkan False alih-alih menagih lagi.

Kolom thinking adalah klaim "3.8 bekerja lebih keras" dari Google yang muncul di terminal. Terhadap prompt yang sama pada 3.7, medium naik dari 2.343 token penalaran menjadi 3.158, dan high dari 2.217 menjadi 4.512, kira-kira dua kali lipat, dan token ekstra itu menghasilkan analisis yang lebih lengkap alih-alih putusan yang berbeda. Latensi naik seiring pada run ini (7,8 dtk, 16,6 dtk, 25,5 dtk), tetapi waktu sekali jalan pada model-model ini bisa bervariasi, jadi bandingkan jumlah token alih-alih detik.

Pilih default dan kapan meningkatkan level

Ini aturan praktis saya untuk level penalaran:

  • Pada 3.8, low mendapat peran lebih besar daripada default medium versi Google: level ini menghasilkan perbaikan yang benar dan berdesain baik pada 0 token penalaran, jadi mulailah dari sini untuk apa pun yang dibaca manusia sebelum menjadi penting (triase, draf, ringkasan, kode yang akan Anda review). 

  • Pertahankan medium di mana output dikirim tanpa dibaca, karena pemikiran ekstra membawa analisis mode kegagalan yang lebih lengkap, dan pipeline tanpa pembaca adalah tempat tepat di mana mode kegagalan yang tidak Anda cantumkan yang akan terjadi.

  • Cadangkan high untuk output di mana jalur gagal itu sendiri adalah produknya, seperti alur pembayaran, migrasi, atau apa pun yang akan diaudit peninjau baris demi baris. Pada run saya, ini satu-satunya level yang menangkap keempat bug dan mendokumentasikan apa yang terjadi setelah upaya habis.

Dengan biaya 6.6x dari low untuk high, pertukaran itu terasa sangat berbeda pada $3,75 per 1M token output sekarang dibanding $7,50 setelah 31 Desember 2026, jadi tingkatkan per permintaan, bukan secara global.

Satu celah yang patut diketahui adalah Google menyatakan 3.7 Flash tetap sepenuhnya didukung untuk beban kerja yang mengutamakan efisiensi. Jika ketelitian ekstra 3.8 berbiaya lebih tinggi daripada yang dibutuhkan tugas Anda, tetap pada gemini-3.7-flash untuk beban kerja tersebut adalah pilihan yang didukung, bukan akal-akalan.

Bagaimana Mengekstrak Data Terstruktur dari PDF?

Gemini 3.8 Flash membaca PDF langsung sebagai input, jadi Anda dapat mengirim faktur atau laporan dan mengajukan pertanyaan tentangnya. Saya menggunakan faktur vendor 1 halaman dengan nomor faktur, tanggal, 4 item baris, dan total.

Lampirkan PDF ke prompt

Mari unggah PDF faktur lokal menggunakan Files API. Files API menangani penyimpanan dan caching file pada infrastruktur Google:

	from google import genai
	client = genai.Client()
	print("Uploading invoice...")
	doc = client.files.upload(file="invoice_aug_2026.pdf")
	print(f"File uploaded: {doc.uri}\n")

	interaction = client.interactions.create(
	   model="gemini-3.8-flash",
	   input=[
	       {
	           "type": "text",
	           "text": "Extract the invoice number, total amount due, and due date.",
	       },
	       {"type": "document", "uri": doc.uri, "mime_type": doc.mime_type},
	   ],
	)
	print(interaction.output_text)

Output dari faktur saya:

Membaca PDF dengan Gemini 3.8 Flash

Ketiga nilai benar. Unggah terjadi sekali, dan file tetap tersedia untuk permintaan berikutnya, yang penting saat Anda mengajukan lebih dari 1 pertanyaan tentang dokumen yang sama. Jawaban kembali sebagai bullet markdown, yang baik untuk dibaca namun tidak ideal untuk dimasukkan ke pipeline.

Paksa JSON dengan skema respons

Untuk mendapatkan JSON alih-alih prosa, oper skema di response_format. Pada Interactions API, ini adalah parameter tingkat atas; pengaturan responseMimeType di dalam generationConfig yang akan Anda lihat di tutorial lama adalah milik endpoint legacy generateContent.

import json

from google import genai
from pydantic import BaseModel

client = genai.Client()


class Invoice(BaseModel):
    invoice_number: str
    total_due_usd: float
    due_date: str  # ISO 8601


doc = client.files.upload(file="invoice_aug_2026.pdf")

interaction = client.interactions.create(
    model="gemini-3.8-flash",
    input=[
        {
            "type": "text",
            "text": "Extract the invoice number, total amount due in USD, and due date.",
        },
        {"type": "document", "uri": doc.uri, "mime_type": doc.mime_type},
    ],
    response_format={
        "type": "text",
        "mime_type": "application/json",
        "schema": Invoice.model_json_schema(),
    },
)

invoice = json.loads(interaction.output_text)
print(invoice)

Ini output yang saya terima: 

Paksa format JSON

Kelas Pydantic Anda mendefinisikan field wajib dan tipe data, sementara model_json_schema() menghasilkan skema JSON yang diperlukan oleh Gemini API. Setelah diproses, json.loads() mengonversi output model menjadi dictionary Python standar. Mulai titik ini, data terstruktur siap diubah menjadi baris DataFrame, dikomit ke database, atau ditambahkan ke Google Sheet.

Ajukan pertanyaan lanjutan dengan previous_interaction_id

Untuk pertanyaan ke-2 tentang dokumen yang sama, oper id interaksi pertama sebagai previous_interaction_id. Server sudah memiliki PDF dan percakapan pertama, jadi Anda tidak mengirim keduanya lagi:

follow_up = client.interactions.create(
    model="gemini-3.8-flash",
    previous_interaction_id=interaction.id,
    input="List each line item on the invoice with its amount.",
)

print(follow_up.output_text)

Ajukan pertanyaan lanjutan ke PDF

Ia mengembalikan semua 4 item berurutan, termasuk baris compute yang berulang, tanpa mengomentari pengulangan. Itu perilaku yang tepat untuk pertanyaan yang diajukan; jika Anda ingin menandai anomali, minta secara eksplisit. 

Sebagai catatan, 3.7 berperilaku identik di sini, jadi ketelitian ekstra 3.8 berlaku pada penalarannya sendiri, bukan untuk menawarkan audit yang tidak Anda minta.

Ada 2 hal yang perlu diketahui tentang panggilan ini: 

  • response_format tidak terbawa, karena ruang lingkupnya interaksi, jadi giliran ini mengembalikan prosa. 

  • Dan interaksi disimpan secara default (store=True) selama 55 hari pada tier berbayar dan 1 hari pada tier gratis; store=False membuat panggilan tanpa status, tetapi Anda kemudian tidak dapat merangkaikan previous_interaction_id darinya.

Bagaimana Menambahkan Function Calling ke Gemini 3.8 Flash?

Function calling pada Gemini 3.8 Flash adalah satu loop, di mana model meminta alat, kode Anda menjalankannya, Anda mengirimkan hasilnya kembali, dan model menulis jawaban akhir. Bagian ini membangun loop itu secara manual.

Jika Anda ingin Google menjalankan loop untuk Anda dengan agen multi-alat terkelola, baca tutorial kami tentang  "Managed Agents" di Gemini API berikutnya. Dan jika tujuan jangka panjang Anda adalah agen, kursus Building AI Agents with Google ADK membangun asisten dukungan pelanggan lengkap di atas primitive yang sama.

Definisikan alat dan jalankan loop interaksi

Alatnya adalah lookup_exchange_rate(currency, date), didukung oleh dict kecil dalam memori, sehingga contoh berjalan tanpa API eksternal. Deklarasinya adalah skema JSON. Model tidak pernah menjalankan fungsinya; ia mengembalikan langkah function_call yang meminta kode Anda untuk:

import json

from google import genai

client = genai.Client()

# Local "data source" standing in for a real FX API
RATES = {
    ("USD", "2026-08-03"): 87.42,
    ("USD", "2026-08-10"): 87.15,
    ("EUR", "2026-08-03"): 95.08,
}


def lookup_exchange_rate(currency: str, date: str) -> dict:
    rate = RATES.get((currency.upper(), date))
    if rate is None:
        return {"error": f"No rate for {currency} on {date}"}
    return {"currency": currency.upper(), "date": date, "inr_rate": rate}


rate_tool = {
    "type": "function",
    "name": "lookup_exchange_rate",
    "description": "Look up the INR exchange rate for a currency on a date (YYYY-MM-DD).",
    "parameters": {
        "type": "object",
        "properties": {
            "currency": {"type": "string", "description": "ISO code, e.g. USD"},
            "date": {"type": "string", "description": "YYYY-MM-DD"},
        },
        "required": ["currency", "date"],
    },
}

# Turn 1: the model decides to call the tool
interaction = client.interactions.create(
    model="gemini-3.8-flash",
    input="What was the USD to INR exchange rate on 2026-08-03?",
    tools=[rate_tool],
)

fc_step = next(s for s in interaction.steps if s.type == "function_call")
print(f"Model requested: {fc_step.name}({fc_step.arguments})")

# Your code executes the function locally
result = lookup_exchange_rate(**fc_step.arguments)

# Turn 2: send the result back; tools must be re-specified (interaction-scoped)
final = client.interactions.create(
    model="gemini-3.8-flash",
    previous_interaction_id=interaction.id,
    input=[
        {
            "type": "function_result",
            "name": fc_step.name,
            "call_id": fc_step.id,
            "result": [{"type": "text", "text": json.dumps(result)}],
        }
    ],
    tools=[rate_tool],
)

print(final.output_text)

Outputnya: 

Function calling Gemini 3.8 Flash

Terjadi 3 hal di sini:  

  1. Giliran 1 mengembalikan langkah function_call dengan nama, argumen terstruktur, dan sebuah id.

  2. Python Anda menjalankan lookup.

  3. Giliran 2 mengirim blok function_result yang mereferensikan panggilan tersebut. 

Parameter tools dioper lagi pada giliran 2 dengan alasan yang sama seperti response_format harus dioper ulang di bagian PDF: previous_interaction_id membawa riwayat, bukan konfigurasi.

Kesalahan function-calling pada Gemini 3.x

Jika loop alat rusak, hampir selalu salah satu dari 2 hal. 

Pertama, setiap hasil harus dipetakan kembali ke panggilannya. Pada Interactions API, itu adalah call_id dan name pada blok function_result; pada API legacy generateContent, FunctionResponse harus cocok dengan id dan name dari FunctionCall sebelumnya. Keduanya tidak opsional pada Gemini 3.x.

Kedua, error Malformed_Function_Call biasanya terjadi ketika model mengeluarkan komentar sebelum panggilan alat. Panduan pengembang 3.8 Google mengatakan untuk membersihkan teks pra-alat, format instruksi inline dengan \n\n, dan bungkus catatan kerja dalam panggilan fungsi khusus alih-alih teks mentah. Perketat system instruction; jangan sekadar retry membabi buta.

Apa yang Rusak Saat Beralih ke Gemini 3.8 Flash?

Itu tergantung dari mana Anda memulai. 

  • Dari Gemini 3.7 Flash: tidak ada. Ubah string model ke gemini-3.8-flash, dan setiap cuplikan di artikel ini berjalan tanpa modifikasi, karena permukaan API identik. 

  • Dari Gemini 3.6 Flash atau sebelumnya, konfigurasi model memerlukan audit 15 menit yang sama seperti sebelumnya.

Daftar periksa migrasi (dari 3.6 Flash atau sebelumnya)

Kerjakan ini berurutan. Butir 1 sampai 3 menyebabkan 400 langsung; butir 4 dan 5 menyebabkan masalah kualitas yang sunyi.

  1. Ubah ID model ke gemini-3.8-flash.

  2. Hapus parameter sampling yang sudah mati: temperature, top_p, dan top_k diabaikan atau ditolak pada Gemini 3.x, dan frequency_penalty, presence_penalty, dan candidate_count memunculkan error API aktif. Hapus keenamnya dari konfigurasi lama.

  3. Ganti thinking_budget dengan thinking_level: gunakan hanya low, medium, atau high. Nilai minimal lama mengembalikan error validasi. Mengirim thinking_budget dan thinking_level sekaligus dalam satu permintaan mengembalikan 400.

  4. Hapus giliran model yang dipraisi: singkirkan ini dari percakapan yang Anda bangun, dan pastikan giliran pengguna terakhir memiliki teks tidak kosong. Payload riwayat tidak boleh diakhiri dengan giliran model.

  5. Standarkan alur multi-giliran: andalkan previous_interaction_id alih-alih pemutaran ulang riwayat sisi klien. Anda harus menyebutkan lagi tools, system_instruction, dan generation_config pada setiap giliran saat itu penting.

Google menerbitkan versi otoritatif di dokumentasi model Gemini API, termasuk jalur otomatis jika agen coding Anda mendukung skills. Tetap bacalah sendiri sekali; migrasi otomatis tidak akan memberi tahu Anda mengapa temperature=0.2 ada sejak awal.

Error yang akan Anda temui di produksi

Berikut 4 kode status yang layak Anda tangani, dan apa arti masing-masing pada API ini:

Status

Penyebab tipikal

Apa yang harus dilakukan

400 INVALID_ARGUMENT

Field legacy tersisa: temperature, thinking_budget, thinking_level: "minimal", frequency_penalty, presence_penalty, candidate_count, giliran model yang dipraisi

Perbaiki permintaan; retry tidak ada gunanya

403 PERMISSION_DENIED

GEMINI_API_KEY salah, hilang, atau dibatasi, atau proyek tidak memiliki akses ke model

Ekspor ulang kunci; periksa apakah disetel, tidak dibatasi untuk API ini, dan tidak dikomit ke git

429

Batas laju pada tier Anda, sering muncul saat pekerjaan ekstraksi batch

Retry dengan exponential backoff dan jitter; pertimbangkan menyebarkan beban

503

Beban sementara di sisi Google

Backoff berjitter yang sama; beri peringatan hanya jika berlanjut lebih dari beberapa menit

Ada 2 hal lagi di sini:

  • Atur timeout klien secara eksplisit saat menggabungkan thinking_level: "high" dengan loop alat yang panjang, karena permintaan yang menggantung lebih buruk daripada yang gagal, dan ketelitian ekstra 3.8 membuat run penalaran panjang lebih mungkin, bukan kurang. 

  • Dan catat interaction.id pada setiap permintaan; itu pegangan Anda untuk mengambil, men-debug, atau menghapus interaksi yang disimpan nanti.

Penutup

Semua dalam artikel ini bermuara pada 3 pergeseran. Interactions API mengubah konvensi pemanggilan, thinking_level menggantikan semua tombol sampling yang dulu Anda atur, dan status sisi server melalui previous_interaction_id adalah yang membuat tindak lanjut PDF dan loop alat menjadi giliran satu-baris alih-alih latihan pemutaran riwayat. Gemini 3.8 Flash tidak mengubah permukaan itu; yang berubah adalah seberapa keras model bekerja di dalamnya, itulah mengapa pengukuran di artikel ini diambil baru pada 3.8 alih-alih dibawa dari 3.7.

Sebelum Anda menerima rekomendasi level saya mentah-mentah, arahkan skrip perbandingan ke tugas dari backlog Anda sendiri; level yang menang pada race pembayaran-ulang mungkin kalah pada beban kerja pembuatan SQL Anda. 

Saat satu panggilan API tidak lagi cukup, dan Anda menginginkan sistem AI produksi, trek Associate AI Engineer for Developers kami mencakup jalur penuh, dan trek Associate AI Engineer for Data Scientists melakukan hal yang sama dari sisi data.

FAQs

Paket Python mana yang saya instal untuk Gemini 3.8 Flash?

Instal google-genai menggunakan pip (pip install -U google-genai). Pustaka google-generativeai yang lebih lama bersifat legacy dan gagal saat Anda mengoper argumen konfigurasi Gemini 3.x.

Apakah Gemini 3.8 Flash mendukung temperature, top_p, atau top_k?

Tidak. Parameter sampling sudah tidak berlaku pada Gemini 3.x, dan 3.8 juga menimbulkan error API aktif untuk frequency_penalty, presence_penalty, dan candidate_count. Anda mengontrol perilaku output dengan thinking_level sebagai gantinya.

Nilai thinking_level apa yang diterima Gemini 3.8 Flash?

Menerima low, medium (default), dan high. Nilai minimal tidak valid dan mengembalikan error validasi API.

Bagaimana Google menagihkan token penalaran pada Gemini 3.8 Flash?

Google menghitung token penalaran sebagai token output standar sebesar $3,75 per 1M token selama periode harga perkenalan, yang berakhir 31 Desember 2026. Google juga mencatat bahwa 3.8 mungkin menghabiskan lebih banyak token penalaran pada tingkat upaya lebih tinggi, sehingga Anda membayar siklus verifikasi ekstra.

Apa itu Gemini 3.8 Flash Cyber, dan bisakah saya menggunakannya?

Ini adalah varian keamanan siber yang disetel untuk penemuan kerentanan dan patching otomatis. Tidak tersedia di API publik; akses dibatasi untuk pihak pembela yang disetujui melalui Fairwind Program Google. Pengembang umum menggunakan gemini-3.8-flash.


Aryan Irani's photo
Author
Aryan Irani
Twitter

Saya menulis dan berkarya di internet. Google Developer Expert untuk Google Workspace, lulusan Ilmu Komputer dari NMIMS, serta pembangun yang antusias di bidang otomasi dan Kecerdasan Buatan Generatif.

Topik
Kecerdasan Buatan
Large Language Models

Belajar AI Bersama DataCamp!

Kursus

Introduction to Google Workspace with Gemini

30 Min
2.2K
You learn about the key features of Gemini and how they can be used to improve productivity and efficiency in Google Workspace.
Lihat DetailRight Arrow
Mulai Kursus
Lihat Lebih BanyakRight Arrow
Terkait

blogs

12 Alternatif ChatGPT Terbaik yang Bisa Anda Coba pada 2026

Artikel ini menyajikan daftar alternatif ChatGPT yang akan meningkatkan produktivitas Anda.
Javier Canales Luna's photo

Javier Canales Luna

14 mnt

blogs

40 Pertanyaan Wawancara DBMS Teratas di 2026

Kuasai pertanyaan wawancara basis data, dari konsep SQL dasar hingga skenario desain sistem tingkat lanjut. Panduan mendalam ini mencakup semua yang Anda perlukan untuk sukses di wawancara DBMS dan meraih peran berikutnya.
Dario Radečić's photo

Dario Radečić

15 mnt

blogs

Spaghetti Plot dan Jalur Badai

Temukan alasan mengapa Anda sebaiknya (tidak) menggunakan spaghetti plot untuk menyampaikan ketidakpastian jalur prediksi badai serta dampaknya terhadap interpretasi.
Hugo Bowne-Anderson's photo

Hugo Bowne-Anderson

13 mnt

blogs

Tutorial Korelasi di R

Dapatkan pengenalan dasar-dasar korelasi di R: pelajari lebih lanjut tentang koefisien korelasi, matriks korelasi, plotting korelasi, dan sebagainya.
David Woods's photo

David Woods

13 mnt

Lihat Lebih BanyakLihat Lebih Banyak