- API web untuk mengirim permintaan bahasa alami ke Gemini Nano yang tertanam di Chrome, dan dapat digunakan untuk tugas seperti tanya jawab, klasifikasi, pemfilteran konten, ekstraksi jadwal, dan ekstraksi kontak
- Sebelum digunakan, diperlukan unduhan model terpisah, dan API hanya berfungsi jika syarat eksekusi seperti OS yang didukung, ruang penyimpanan, serta memori GPU atau CPU terpenuhi
- Sesi disiapkan dengan memeriksa ketersediaan melalui
LanguageModel.availability() lalu menjalankan create(), dan konteks dapat diteruskan atau dibuat bercabang dengan initialPrompts, append(), dan clone()
- Input dapat menerima text, image, audio, sementara output saat ini hanya mendukung text;
prompt() mengembalikan respons lengkap, dan promptStreaming() mengembalikan respons streaming
- Menyediakan model eksekusi untuk menangani AI on-device di dalam browser, termasuk output terstruktur berbasis
responseConstraint, pengelolaan jendela konteks, kebijakan izin, hingga pemrosesan multimodal
Gambaran umum
- Berfungsi sebagai API untuk mengirim permintaan bahasa alami ke Gemini Nano yang tertanam di Chrome, dan dapat dimanfaatkan untuk tanya jawab berbasis halaman web, klasifikasi artikel, pemfilteran konten, ekstraksi jadwal, dan ekstraksi kontak
- Meski API sudah tertanam di Chrome, model tetap memerlukan unduhan terpisah, dan sebelum penggunaan pertama perlu meninjau Google's Generative AI Prohibited Uses Policy
- Sebelum menggunakan AI generatif, disarankan merujuk ke People + AI Guidebook
- Typing TypeScript tersedia melalui paket @types/dom-chromium-ai
- Pengembang Chrome Extensions perlu menghapus izin origin trial yang sudah kedaluwarsa, yaitu
aiLanguageModelOriginTrial
Perangkat keras dan syarat eksekusi
- Prompt API·Summarizer API·Writer API·Rewriter API·Proofreader API hanya berfungsi di Chrome jika syarat tertentu terpenuhi
- Sistem operasi yang didukung adalah Windows 10/11, macOS 13+, Linux, dan ChromeOS; untuk ChromeOS, dukungan tersedia pada perangkat Chromebook Plus dengan Platform 16389.0.0 atau lebih baru
- Chrome untuk Android, iOS, dan ChromeOS pada perangkat non-Chromebook Plus masih belum mendukung API berbasis Gemini Nano
- Penyimpanan memerlukan minimal 22GB ruang kosong pada volume tempat profil Chrome berada
- Model dapat dijalankan dengan GPU atau CPU
- GPU memerlukan VRAM lebih dari 4GB
- CPU memerlukan RAM 16GB atau lebih dan setidaknya 4 core CPU
- Prompt API yang menggunakan input audio memerlukan GPU
- Jaringan hanya memerlukan koneksi tak terbatas atau non-metered saat pengunduhan model awal
- Setelah itu, penggunaan model tidak memerlukan koneksi jaringan
- Saat model digunakan, data tidak dikirim ke Google atau pihak ketiga
- Ukuran model dapat berubah sesuai pembaruan browser, dan ukuran saat ini dapat diperiksa di
chrome://on-device-internals
- Jika setelah pengunduhan ruang kosong turun menjadi kurang dari 10GB, model akan dihapus dari perangkat, lalu diunduh ulang saat syarat kembali terpenuhi
Memulai penggunaan dan menyiapkan model
- Ketersediaan dapat diperiksa melalui
LanguageModel.availability()
- Ke
availability() harus diberikan opsi yang sama dengan yang nantinya akan digunakan pada prompt() atau promptStreaming()
- Beberapa model mungkin tidak mendukung modalitas atau bahasa tertentu, sehingga kecocokan opsi penting
- Pengunduhan model dan pembuatan sesi dimulai dengan
create() setelah konfirmasi user activation
- Jika unduhan sedang berlangsung, event progres perlu diterima agar status unduhan bisa diinformasikan kepada pengguna
- Di localhost, API AI bawaan dapat digunakan dengan mengaktifkan flag Chrome
chrome://flags/#optimization-guide-on-device-model
chrome://flags/#prompt-api-for-gemini-nano-multimodal-input
- Setelah itu perlu Relaunch atau memulai ulang Chrome
- Jika terjadi error, bisa merujuk ke pemecahan masalah localhost
Pembuatan sesi dan pengaturan dasar
- Sesi dibuat dengan
LanguageModel.create()
- Pada Prompt API untuk Chrome Extensions, topK dan temperature dapat disesuaikan sebagai opsi per sesi
- Nilai default dan maksimum dapat diperiksa melalui
LanguageModel.params()
- Fitur ini hanya berlaku pada Chrome Extensions atau saat menggunakan sampling parameters origin trial
params() mengembalikan defaultTopK, maxTopK, defaultTemperature, dan maxTemperature
- Saat menginisialisasi sesi baru,
topK dan temperature harus keduanya ditentukan atau keduanya dihilangkan
create() dapat menerima AbortSignal melalui field signal untuk membatalkan sesi
Konteks dan penyusunan prompt
initialPrompts dapat digunakan untuk memasukkan konteks percakapan sebelumnya, sehingga sesi yang disimpan dapat dilanjutkan setelah browser dimulai ulang
- Dalam array prompt, peran
system, user, dan assistant dapat disertakan bersama
- Jika pesan
assistant terakhir diberi prefix: true, sebagian respons dapat diisi sebelumnya untuk mengarahkan format output tertentu
- Contohnya, string pembuka code block TOML diisi lebih dulu untuk mengunci format output
- Setelah sesi dibuat, konteks tambahan dapat dimasukkan lebih dulu dengan
append()
- Berbeda dengan
initialPrompts, konteks dapat terus diakumulasikan bahkan setelah sesi dibuat
append() diselesaikan setelah prompt divalidasi, diproses, dan ditambahkan
- Jika prompt tidak dapat ditambahkan, promise akan ditolak
Modalitas input/output dan multibahasa
- Saat membuat sesi, format dan bahasa input/output yang diharapkan dapat ditentukan melalui
expectedInputs dan expectedOutputs
type pada expectedInputs mendukung text, image, dan audio
type pada expectedOutputs saat ini hanya mengizinkan text
- Bahasa diatur melalui array
languages, dan Prompt API menerima "en", "ja", "es"
- Dukungan bahasa tambahan sedang dikembangkan
- Di sisi input, bahasa system prompt dan satu atau lebih bahasa user prompt dapat dimasukkan
- Di sisi output, satu atau lebih bahasa output dapat dimasukkan
- Jika menemukan input atau output yang tidak didukung, dapat terjadi DOMException
"NotSupportedError"
Input multimodal
- Dapat digunakan untuk tugas seperti transkripsi audio atau pembuatan deskripsi gambar, caption, dan alt text
- Demo terkait
- Input audio mendukung tipe berikut
- Input visual mendukung tipe berikut
- Dalam contoh,
Blob gambar dan HTMLCanvasElement dimasukkan bersama untuk membandingkan dua materi visual, lalu dilanjutkan dengan menerima respons suara pengguna melalui AudioBuffer
Output terstruktur dan pembatasan
- Output terstruktur dapat digunakan dengan memasukkan JSON Schema ke
responseConstraint pada prompt() atau promptStreaming()
- Fitur terkait dapat dilihat di structured output
- Dalam contoh, skema boolean dimasukkan agar postingan hanya dijawab dengan
true atau false berdasarkan apakah terkait keramik
- Saat implementasi, JSON Schema atau regex juga bisa dimasukkan sebagai bagian dari pesan, tetapi dalam hal ini akan menggunakan sebagian dari context window
- Dengan memberikan opsi
responseConstraint ke session.measureContextUsage(), dapat diukur seberapa besar pembatasan menggunakan konteks
- Perilaku ini dapat dihindari dengan opsi
omitResponseConstraintInput
- Dalam kasus ini, disarankan untuk turut memasukkan panduan tentang format output yang diinginkan di dalam prompt
Cara menjalankan prompt
- Jika diperkirakan responsnya pendek, gunakan
prompt() untuk menerima hasil lengkap sekaligus
- Jika diperkirakan responsnya panjang, gunakan
promptStreaming() untuk menerima hasil parsial secara streaming
promptStreaming() mengembalikan ReadableStream
- Baik
prompt() maupun promptStreaming() menerima signal sebagai argumen kedua untuk membatalkan prompt yang sedang berjalan
Pengelolaan sesi
- Setiap sesi mempertahankan konteks percakapan, sehingga interaksi sebelumnya tercermin pada respons berikutnya
- Tiap sesi memiliki jumlah token maksimum yang dapat diproses, dan penggunaan serta batas saat ini dapat diperiksa melalui
session.contextUsage dan session.contextWindow
- Jika jendela konteks terlampaui oleh prompt baru, bagian awal percakapan selain system prompt akan dihapus per pasangan tanya-jawab untuk menyediakan ruang
- Situasi ini dapat dideteksi melalui event
contextoverflow pada sesi
- Jika token yang cukup tetap tidak bisa diamankan meski riwayat percakapan dihapus,
prompt() atau promptStreaming() akan gagal dengan QuotaExceededError, dan tidak ada yang dihapus
requested: jumlah token yang digunakan input
contextWindow: jumlah token yang tersedia
- Detail lebih lanjut dapat dilihat di session management
Kloning dan penghentian sesi
- Dengan
clone(), sesi yang ada dapat disalin untuk membuat percabangan percakapan
- Sesi hasil kloning mempertahankan konteks yang ada dan prompt awal
clone() juga dapat menerima AbortSignal melalui field signal
- Jika sesi tidak lagi diperlukan, resource dapat dibebaskan dengan
destroy()
- Setelah sesi dihancurkan, sesi tidak dapat digunakan lagi dan eksekusi yang sedang berjalan juga dihentikan
- Karena pembuatan sesi bisa memakan waktu, jika Anda berencana sering mengirim prompt, mempertahankan sesi mungkin lebih baik
Kebijakan izin dan batasan lingkungan eksekusi
- Secara default, Prompt API hanya dapat digunakan pada window tingkat atas dan iframe dengan origin yang sama
- Untuk iframe cross-origin, hak akses dapat didelegasikan dengan atribut Permission Policy
allow="language-model"
- Saat ini Prompt API tidak dapat digunakan di Web Workers
- Karena rumit untuk menentukan dokumen yang bertanggung jawab memeriksa status permissions policy pada tiap worker
Demo dan referensi
- Demo aplikasi web
- Ekstensi demo untuk pengujian Chrome Extensions juga disediakan
Performa dan masukan
- Prompt API untuk web masih dalam pengembangan aktif
- Untuk performa optimal, sebaiknya merujuk ke praktik terbaik session management
- Jalur umpan balik implementasi
1 komentar
Pendapat Hacker News
API ini tampaknya sangat cocok dengan ide de-snarkifier yang sudah lama kupikirkan
Media sosial memang bisa merangsang secara intelektual dan ada hal yang bisa dipelajari, tetapi tanpa sadar kita mudah tersedot ke adu argumen ideologis dan perang komentar. Bertengkar dengan orang asing di internet sambil menguras emosi nyaris seperti pemborosan modal manusia
Kalau ada API seperti ini, sepertinya bisa dibuat ekstensi browser yang sebelum menampilkan tulisan akan melembutkan ekspresi yang agresif atau menyindir saja, sambil tetap menjaga informasi faktual apa adanya. Bahkan bisa dikembangkan lebih jauh agar semakin agresif nadanya, semakin terdengar konyol atau tidak kompeten
Dengan begitu pembaca terlindungi dari serangan pribadi orang asing, dan penulis pun kehilangan insentif untuk bersikap kasar. Kalau semua orang memakai filter seperti ini, tidak ada lagi alasan untuk berlomba jadi yang paling jahat
Semua gizinya ada, tetapi rasanya tidak ada yang istimewa
Yang kuinginkan hanyalah menghapus semua judul clickbait dan iklan, lalu hanya menampilkan judul faktual yang kering
Untuk topik apa pun, satu artikel inti dan beberapa komentar yang benar-benar berguna sudah cukup, sisanya kebanyakan hanya kebisingan yang tidak ingin kulihat
Kondisi media sosial sekarang sangat buruk sampai aku hampir tidak memakainya sama sekali, dan HN tadinya satu-satunya pengecualian, tetapi di sini pun tampaknya mulai bergerak ke arah serupa karena banjir AI. Meski begitu, tiap dua minggu sekali aku masih bisa membuang beberapa jam di sana, dan aku ingin memutusnya sepenuhnya
Idealnya, 98% konten difilter atau diringkas sampai hilang, dan seiring waktu internet hanya kupakai saat sengaja mencari sesuatu. Pada dasarnya aku ingin menghapus sebagian besar sifat hiburan internet agar waktu dan energiku kembali ke dunia nyata dan sumber berkualitas tinggi seperti buku
Ekstensi ini adalah alat crowdsourcing untuk mengurangi sensasionalisme, tetapi kupikir sebagian kontributor teratasnya mungkin bot LLM
Hanya saja, hal seperti ini saat berhadapan dengan dunia nyata cenderung tidak terduga, dan bahkan kalau berhasil pun besar kemungkinan akan bekerja sangat berbeda dari yang pertama kali dibayangkan
Aku tidak tahan dan langsung membuat prototipe Snarknada secara tergesa-gesa sambil melihat pola latensi rendah dan kemungkinan akurasinya
Tepat inilah alasan aku merasa on-device cocok untuk jenis penggunaan seperti ini. Jika seluruh feed infinite scroll harus dilembutkan lewat cloud API, biaya tokennya akan menjadi terlalu besar untuk ditanggung pengembang. Selain itu, wajar juga kalau orang tidak ingin feed pribadi atau DM mereka dikirim ke server pihak ketiga hanya untuk merapikan nada
Kalau ini dipindahkan ke dalam perangkat, Semantic Mutation berfrekuensi tinggi untuk pertama kalinya bisa menjadi realistis dari sisi biaya maupun teknis. Jika kamu membuat sesuatu yang lebih serius daripada prototipe PM isenganku ini dan menemukan titik gesekan yang konkret, aku benar-benar ingin mendengarnya. Itu membantu dalam menentukan prioritas roadmap
[1]: Jika kamu memakai coding agent (Cursor, Claude Code, dll.), aku sarankan mengarahkannya ke https://www.npmjs.com/package/built-in-ai-skills-md-agent-md. Banyak model sekarang dilatih dengan namespace window.ai yang sudah usang, jadi file skill ini membantu agar mereka memakai API saat ini dengan benar
Aku memimpin pekerjaan desain API ini, dan sebelum pensiun aku juga menulis artikel yang merangkum pertimbangan desain terkait
https://domenic.me/builtin-ai-api-design/
Juga penasaran apakah saat membuat hal seperti ini, browser-browser berusaha menyelaraskan kesamaan secara praktis satu sama lain, bukan di level W3C, karena pada akhirnya industri ini cukup kecil
Ini benar-benar berjalan, dan aku sudah pernah merilisnya untuk local inference
Untuk pekerjaan LLM ringan seperti pencarian, ini bisa dipakai seperti ollama versi orang pas-pasan. Keuntungan terbesarnya adalah gratis, menjaga privasi, dan pengguna hampir tidak perlu melakukan apa-apa, jadi cocok untuk memberi inferensi lokal kepada pengguna nonteknis
Hanya saja pengalaman pengguna nyatanya buruk. Ukuran unduhan modelnya beberapa tingkat lebih besar daripada browser itu sendiri, dan proses itu harus selesai sebelum token pertama diterima
Ini tampaknya sulit diselesaikan sampai sistem operasi menyediakan model baked-in secara andal, dan API seperti ini bisa menempel ke sana
Masalah yang lebih besar adalah di kebanyakan PC biasa, modelnya terlalu kecil dan lambat. Aku mencoba mengubah kalimat infocom text adventure secara real time, tetapi sekarang di banyak PC masih terlalu lambat untuk praktis
Mirip cara bittorrent menerima potongan file dari banyak host. Layer bersama tetap harus diunduh, tetapi waktu sampai token pertama bisa dibuat sebanding dengan ukuran aktif, bukan ukuran total
Tentu itu berarti bukan inferensi offline sepenuhnya, tetapi untuk fitur web browser, mungkin itu bukan pertimbangan utama
Hanya saja, jika modelnya jauh lebih besar daripada browser dan harus diunduh sebelum token pertama, aku penasaran apakah ini berarti lazy download. Jika pengguna yang pertama kali memanggilnya harus menunggu sampai unduhan selesai saat itu juga, pengalaman penggunanya terdengar cukup mengerikan
Aku juga penasaran apakah Chrome menampilkan sesuatu seperti dialog status unduhan agar tidak membingungkan, dan seberapa besar pemakaian disknya
Sekilas ini tampaknya memakai Gemini Nano, tetapi Gemma 4 E2B/E4B terbaru terlihat jauh lebih baik, jadi untuk saat ini mungkin lebih baik mendistribusikan versi terkuantisasi lewat ekstensi
Sumber:
Jika Gemma 4 atau Gemini Nano yang setara masih belum ada di Chrome, aku menduga itu akan segera masuk
Dan tulisan ini terakhir diperbarui pada 2025-09-21, dan saat itu sudah Gemini Nano 3
Tertulis bahwa Prompt API bekerja dengan mengirim permintaan bahasa alami ke Gemini Nano di dalam browser
Di Edge, kemungkinan itu Phi4
Ini juga terlihat seperti cara yang bagus bagi skrip JS jahat untuk melemparkan generasi token ke pengunjung yang tidak tahu apa-apa
Akan menarik juga melihat apakah distribusi dimungkinkan lewat pola subagent atau struktur mirip RLM, dengan memecah prompt besar menjadi bagian-bagian kecil lalu mengirimkannya ke banyak browser sehingga masing-masing hanya memproses serpihan kecil namun tetap menghasilkan hasil yang berguna
Infrastruktur teknis dan bisnisnya juga akan jadi sangat rumit, jadi kalau memang ingin melempar prompt ke browser pengguna, bukankah lebih baik langsung memakai Chrome API dengan benar saja. Aku juga ragu seberapa sering benar-benar berarti untuk mengalihkan prompt sisi server ke model ringan seperti ini
Lagi pula, kalau memang benar-benar ingin melakukan itu, WebGPU juga sudah ada sejak lama
Ini tampak seperti satu langkah menuju Model API yang layak, tetapi masih langkah kecil
Ini juga mengingatkanku pada Foundation Models dari Apple
Banyak integrasi AI berfokus pada komunikasi teks atau gaya chat, tetapi sebenarnya ada banyak perangkat lunak yang diuntungkan oleh antarmuka nonteks
Pada akhirnya, menurutku OS dan browser perlu menyediakan API yang mengelola model, sehingga aplikasi bisa mengakses model on-device dan model jarak jauh lewat antarmuka sederhana
Akan sangat bagus jika ini distandardisasi lintas platform, dan karena harus mencakup mobile juga, secara realistis pihak yang paling mungkin mendorongnya adalah Apple dan Google. Meta bisa menyusul, atau justru bergerak lebih dulu
Intinya, ini tidak boleh menjadi khusus untuk model promosi tertentu
Aplikasi harus bisa melakukan query dan memilih model yang sesuai untuk dipakai
(1) https://developer.apple.com/documentation/foundationmodels
Tentu saja, ini masih tahap awal
https://github.com/mozilla/standards-positions/issues/1067
Kami memakai ini untuk ringkasan retrospektif hackday
https://remotehack.space/previous-hacks/
Ini skrip kecil yang membaca feed RSS dan membuat ringkasan ke bentuk paragraf, dan cukup cocok untuk situs statis. Suatu hari aku ingin memperluasnya agar bisa mengajukan pertanyaan lain untuk konten yang sama
LLM lokal yang bisa diakses dari browser memang bagus dari sisi privasi, tetapi kalau model di balik API ini berbeda-beda menurut browser, mimpi buruk pengujian tampaknya akan jadi lebih parah daripada sekarang
Pada akhirnya, kemungkinan besar sebagian besar implementasi akan disesuaikan dengan Gemini Nano, jadi aku juga penasaran apakah ini akan makin mendorong pengguna ke Chrome
Pada praktiknya prompt tidak model-agnostik, jadi prompt yang dituning dengan cermat untuk Gemini Nano 3 v2025 bisa diam-diam turun performanya pada model pihak Gecko. Namun API ini bahkan tidak memberi deteksi kapabilitas untuk menangani percabangan
Ini bahkan lebih buruk daripada WebGL, yang setidaknya memungkinkan query dukungan ekstensi. Merilis fitur yang bergantung pada kualitas prompt model yang nama dan versinya disembunyikan di balik browser mirip seperti merilis perangkat lunak yang fiturnya ditentukan oleh kamus yang terpasang pada pengguna
Kurasa Gemini Nano tidak open-weight seperti Gemma
Kalau belum ada orang yang melakukannya, aku ingin mencoba dump bobot modelnya