3 poin oleh GN⁺ 5 jam lalu | 1 komentar | Bagikan ke WhatsApp
  • 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

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

Performa dan masukan

1 komentar

 
GN⁺ 5 jam lalu
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

    • Ini seperti Soylent untuk komunikasi tertulis
      Semua gizinya ada, tetapi rasanya tidak ada yang istimewa
    • Alat seperti ini benar-benar membuatku antusias. Ada kemungkinan ini akan mengurangi pemakaian platform populer secara besar-besaran dengan membuang kalori kosong internet
      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
    • Di YouTube sudah ada yang mirip, dan aku memakai DeArrow
      Ekstensi ini adalah alat crowdsourcing untuk mengurangi sensasionalisme, tetapi kupikir sebagian kontributor teratasnya mungkin bot LLM
    • Ide yang menarik dan tampaknya layak dieksplorasi
      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 PM untuk built-in AI APIs di Chrome, dan aku sangat suka ide de-snarkifier ini, juga tampaknya minat terhadapnya cukup luas
      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/

    • Aku penasaran bagaimana kamu melihat target use case API ini dalam jangka pendek dan panjang
      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
    • Selamat atas pensiunnya
  • 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

    • Ini adalah unduhan satu kali yang dibagikan oleh semua situs yang memakai Prompt API
      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
    • Arus besar berikutnya mungkin malah langganan premium software yang dijual bersama beberapa 5090 sekaligus
    • Jika itu model MoE, layer ahli bisa diambil dari jaringan hanya saat diperlukan melalui HTTP range query
      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
    • Aku berharap kita tidak sampai ke dunia di mana sistem operasi secara andal menyertakan model pramuat
    • Bagus sekali
      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

    • Gemini Nano-1: 46% MMLU, 1.8B
    • Gemini Nano-2: 56% MMLU, 3.25B
    • Gemma4 E2B: 60.0% MMLU, 2.3B
    • Gemma4 E4B: 69.4% MMLU, 4.5B
      Sumber:
    • https://huggingface.co/google/gemma-4-E2B-it
    • https://android-developers.googleblog.com/2024/10/gemini-nano-experimental-access-available-on-android.html
    • Aku tidak tahu kondisi internalnya sekarang, tetapi saat aku masih di tim ini, model Google kecil terbaru dimasukkan ke Chrome dengan sangat cepat
      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
    • Benar
      Tertulis bahwa Prompt API bekerja dengan mengirim permintaan bahasa alami ke Gemini Nano di dalam browser
    • Prompt API memakai model yang tersedia di 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

    • Pekerjaannya tampak terlalu besar dibanding imbalannya
      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
    • Generasi token dari model kecil hampir tidak punya nilai
  • 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

    • Foundation Models milik Apple terlihat bagus di dokumentasi, tetapi saat dilihat lebih dekat ternyata dibatasi oleh jendela konteks 4k
      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

    • Fragmentasi pengujian memang masalah intinya
      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