[go: up one dir, main page]

Ander Dobo
Flutter
Dipublikasikan di
Bacaan 5 menit

--

Memperkenalkan Google AI Dart SDK

Kami sangat gembira mengumumkan peluncuran Google AI Dart SDK untuk API Gemini. Paket pub.dev baru, google_generative_ai, dan sumber daya pendukung memungkinkan Anda membuat fitur berbasis AI generatif Anda sendiri ke dalam aplikasi Dart dan Flutter melalui integrasi Dart idiomatis dengan API Gemini. Hal ini membuka peluang luas untuk membuat aplikasi cerdas dan berperforma baik untuk Android, iOS, web, MacOS, Windows, dan Linux dari satu code base.

Dengan Google AI Dart SDK, Anda dapat:

  • Mengintegrasikan fitur AI generatif dengan mudah: Menambahkan pembuatan teks tingkat lanjut, ringkasan, chat, dan lainnya ke aplikasi Dart atau Flutter Anda dengan penyiapan minimal.
  • Memanfaatkan model Google yang paling mumpuni dan umum: Model Gemini memanfaatkan penelitian dan pengembangan ekstensif Google dalam machine learning, sehingga memberi Anda akses ke kemampuan AI generatif yang akan terus ditingkatkan.
  • Mempercepat pengembangan aplikasi Anda yang didukung AI: Fokus pada logika aplikasi dan pengalaman pengguna Anda, sementara SDK menangani seluk-beluk interaksi dengan model AI.
  • Membuat aplikasi yang didukung AI lintas platform: Buat fitur AI generatif dengan mudah di desktop, web, dan aplikasi seluler menggunakan Flutter.
  • Menggunakan API Gemini di 180+ negara dan wilayah: Periksa wilayah yang tersedia untuk mengetahui daftar terkini negara dan wilayah ketersediaan API Gemini dan Google AI Studio (dijelaskan lebih lanjut di bawah).

Apa yang dapat Anda buat?

Kami percaya AI generatif memiliki potensi besar untuk membantu Anda mencapai tujuan aplikasi dan bisnis Anda. Dan karena model Gemini bersifat multimodal (mampu memproses informasi dari berbagai modalitas, termasuk gambar dan teks), model ini memberdayakan Anda untuk menjadi sangat kreatif. Namun, pertanyaan pertama yang sering kami dapat dari developer aplikasi — dan bahkan dari dalam tim kami sendiri — adalah “Apa yang sebenarnya bisa saya lakukan dengan API Gemini?” Inilah beberapa contoh fitur yang mungkin Anda buat untuk aplikasi Dart atau Flutter:

  • Ringkasan teks: Membuat ringkasan singkat artikel panjang, makalah penelitian, atau konten situs web dari input tekstual.
  • Chatbot cerdas: Membuat antarmuka percakapan yang lebih menarik dan mirip manusia, sehingga meningkatkan pengalaman pengguna dalam aplikasi Anda.
  • Mesin telusur visual: Pengguna dapat mengunggah gambar, dan aplikasi menggunakan API Gemini untuk memberikan deskripsi tentang sesuatu yang ada dalam gambar, gayanya, dan bahkan mungkin cara membuat sesuatu yang ada dalam gambar tersebut.
  • Deskripsi gambar untuk aksesibilitas: Membuat deskripsi teks terperinci dari gambar yang diupload untuk membantu pengguna tunanetra.
  • Interpretasi diagram & bagan: Pengguna dapat mengupload gambar diagram, bagan, atau grafik, dan API Gemini memberikan analisis dan penjelasan data berbasis teks.

Daftar ini bisa terus bertambah karena kemungkinannya hampir tidak terbatas!

Screenshot aplikasi contoh Flutter yang menggunakan Google AI Dart SDK
Screenshot aplikasi contoh Flutter yang menggunakan Google AI Dart SDK

Memulai

Lihat Panduan memulai Dart untuk panduan langkah demi langkah yang mendetail tentang cara melakukan penyiapan. Pada tingkat tinggi, inilah yang akan Anda lakukan:

  1. Dapatkan kunci API Gemini dari Google AI Studio. Jaga keamanan kunci ini. Kami sangat menyarankan agar Anda tidak menyertakan kunci secara langsung dalam kode Anda, atau memasukkan file yang berisi kunci tersebut ke dalam sistem kontrol versi. Saat melakukan pengembangan, sebaiknya gunakan flutter run -d [DEVICE NAME] — dart-define=API_KEY=[YOUR API KEY] untuk menjalankan aplikasi di emulator/simulator, dengan menggunakan kunci API Anda sebagai variabel lingkungan.
  2. Tambahkan Google AI Dart SDK ke aplikasi Dart atau Flutter Anda dengan masing-masing menjalankan dart pub add google_generative_ai atau flutter pub add google_generative_ai. Ini menambahkan google_generative_ai sebagai dependensi pada file `pubspec.yaml` Anda.
  3. Melakukan inisialisasi model generatif dalam kode Anda:
import 'package:google_generative_ai/google_generative_ai.dart';

// Access your API key as an environment variable (see first step above)
final apiKey = Platform.environment['API_KEY'];
if (apiKey == null) {
print('No \$API_KEY environment variable');
exit(1);
}

final model = GenerativeModel(model: 'MODEL_NAME', apiKey: apiKey);

4. Kini, Anda dapat mulai menjelajah menggunakan API Gemini untuk mengimplementasikan berbagai kasus penggunaan. Misalnya, ketika input perintah menyertakan teks dan gambar, gunakan model gemini-pro-vision dan metode generateContent untuk menghasilkan output teks:

import 'dart:io';

import 'package:google_generative_ai/google_generative_ai.dart';

void main() async {
// Access your API key as an environment variable (see first step above)
final apiKey = Platform.environment['API_KEY'];
if (apiKey == null) {
print('No \$API_KEY environment variable');
exit(1);
}
// For text-and-image input (multimodal), use the gemini-pro-vision model
final model = GenerativeModel(model: 'gemini-pro-vision', apiKey: apiKey);
final (firstImage, secondImage) = await (
File('image0.jpg').readAsBytes(),
File('image1.jpg').readAsBytes()
).wait;
final prompt = TextPart("What's different between these pictures?");
final imageParts = [
DataPart('image/jpeg', firstImage),
DataPart('image/jpeg', secondImage),
];
final response = await model.generateContent([
Content.multi([prompt, ...imageParts])
]);
print(response.text);
}

Jelajahi dokumentasi API Gemini dan lihat aplikasi contoh Dart dan Flutter di repo GitHub untuk panduan mendetail dan contoh tentang cara menggunakan SDK untuk berbagai kasus penggunaan, atau di aplikasi contoh ini di DartPad, yang merupakan editor online sumber terbuka gratis untuk cuplikan Dart dan Flutter, kini dibuat dengan Flutter. Silakan laporkan masalah apa pun atau beri tahu kami tentang permintaan fitur di generative-ai-dart GitHub repo.

Google AI Studio

Selain SDK, Google AI Studio adalah IDE berbasis browser untuk pembuatan prototipe dengan model generatif. Hal ini memungkinkan Anda melakukan iterasi dengan cepat mengembangkan perintah untuk kasus penggunaan Anda, lalu mendapatkan kunci API untuk digunakan dalam pengembangan aplikasi Anda. Anda dapat login ke Google AI Studio dengan akun Google Anda dan memanfaatkan kuota gratis yang memungkinkan 60 permintaan per menit. Untuk membantu kami meningkatkan kualitas produk, saat Anda menggunakan kuota gratis, input dan output Google AI Studio Anda mungkin dapat diakses oleh peninjau terlatih. Data ini tidak diidentifikasi dari akun Google dan kunci API Anda.

Kami akan segera menambahkan Dart ke Google AI Studio, jadi nantikan pengumumannya! Ini memungkinkan Anda cukup mengklik “Dapatkan kode”, memilih tab Dart baru (yang akan berada di samping bahasa yang didukung), lalu “Salin” kode Dart untuk mentransfer pekerjaan Anda ke IDE pilihan Anda.

Screenshot Google AI Studio
Google AI Studio

Bagikan yang Anda buat!

Kami menantikan yang akan Anda buat dengan Gemini, seperti tim di LeanCode yang menggunakan API Gemini untuk membuat arb_translate. Ini adalah paket yang membantu developer melakukan terjemahan bahasa secara otomatis, menyederhanakan pelokalan di aplikasi Flutter.

Gunakan hashtag #BuildWithGemini di Twitter/X untuk memberi tahu kami yang sedang Anda buat!

Hari ini di Google I/O, kami mengumumkan Dart SDK baru, versi 2.17. Rilis ini dibangun di atas tema inti kami tentang produktivitas dan portabilitas platform terdepan. Rilis ini menawarkan fitur bahasa baru: enum dengan dukungan anggota, penerusan parameter yang ditingkatkan ke super class, dan banyak fleksibilitas untuk parameter bernama. Kami telah meningkatkan alat dengan versi utama package:lints terbaru — dukungan alat untuk memeriksa kode Dart terhadap praktik terbaik kami — dan banyak update dokumentasi API library inti dengan contoh kode beragam. Untuk integrasi platform yang lebih baik, kami punya template baru untuk penggunaan dart:ffi (interop C native) di plugin Flutter, dukungan eksperimental untuk prosesor RISC-V, dan dukungan untuk menandatangani file macOS dan Windows yang dapat dieksekusi.

Spanduk rilis Dart 2.17

Fitur bahasa baru untuk meningkatkan produktivitas

Kami terus mengembangkan bahasa Dart untuk membuat Anda semakin produktif — baik dengan menambahkan fitur baru maupun dengan menyempurnakan fitur yang sudah ada. Dart 2.17 menambahkan dukungan utama baru untuk anggota pada enum, menyempurnakan cara Anda menggunakan argumen bernama dalam konstruktor, dan membuat kode untuk meneruskan parameter ke superclass jauh lebih ringkas dan tidak repetitif.

Enum yang ditingkatkan dengan anggota

Enum sangat bagus untuk merepresentasikan kumpulan status terpisah. Sebagai contoh, kita mungkin memodelkan air sebagai enum Water { frozen, lukewarm, boiling }. Namun bagaimana jika kita ingin menambahkan beberapa metode pada enum — misalnya, untuk mengubah setiap status menjadi suhu, dan mendukung konversi enum ke String? Kita mungkin bisa menggunakan metode ekstensi untuk menambahkan metode waterToTemp(), tetapi kita harus berhati-hati untuk menjaganya tetap sinkron dengan enum. Untuk konversi String, kami lebih suka mengganti toString(), tetapi ini belum didukung.

Dengan Dart 2.17 kami sekarang memiliki dukungan umum untuk anggota enum. Ini berarti kita bisa menambahkan status fields holding, konstruktor yang mengatur status tersebut, metode dengan fungsionalitas, bahkan mengganti anggota yang sudah ada. Banyak yang meminta kemampuan tersebut; ini adalah masalah dengan suara tertinggi ketiga dalam tracker bahasa.

Untuk contoh air tersebut, kita bisa menambahkan kolom int yang memiliki suhu dan konstruktor default yang memuat int:

enum Water {

final int tempInFahrenheit;
const Water(this.tempInFahrenheit);
}

Untuk memastikan konstruktor dipanggil saat enum dibuat, kita harus memanggilnya untuk setiap nilai enum:

enum Water {
frozen(32),
lukewarm(100),
boiling(212);

}

Untuk mendukung konversi ke String, kita cukup mengganti toString, yang diwarisi enums dari Object:

@override
String toString() => "The $name water is $tempInFahrenheit F.";

Dan dengan itu, Anda memiliki enum lengkap yang bisa dengan mudah dipakai membuat instance dan Anda dapat memanggil metode dari sana:

void main() {
print(Water.frozen); // Prints “The frozen water is 32 F.”
}

Contoh lengkap dari kedua pendekatan diilustrasikan di bawah ini; kami menemukan versi Dart 2.17 yang baru jauh lebih mudah dibaca dan dipelihara.

Super initializer

Saat Anda memiliki hierarki pewarisan class, pola umumnya adalah meneruskan beberapa parameter konstruktor ke konstruktor superclass. Untuk melakukannya, sub-class harus 1) membuat daftar setiap parameter dalam konstruktornya sendiri, dan 2) memanggil konstruktor super dengan parameter tersebut. Ini mengarah ke kode boilerplate: banyak repetisi, membuat kode sulit dibaca dan lebih merepotkan dipelihara.

Beberapa anggota komunitas Dart membantu mewujudkan hal ini. Pengguna GitHub @roy-sianez melaporkan masalah bahasa terkait hal ini sekitar setengah tahun yang lalu; ia menyarankan sesuatu yang mirip dengan saran dari pengguna GitHub @apps-transround sebelumnya: kita mungkin dapat menyelesaikannya dengan memperkenalkan konstruksi baru untuk menyatakan bahwa parameter telah ditentukan di super class. Kami berpikir itu adalah ide yang bagus, jadi ini telah ditambahkan ke Dart 2.17. Seperti yang Anda lihat dari contoh berikut, ini sangat relevan untuk kode widget Flutter. Bahkan, ketika kami menerapkan fitur baru ke framework Flutter, kami melihat pengurangan total hampir dua ribu baris kode!

Argumen bernama di mana-mana

Terakhir, kami telah menyempurnakan cara kerja argumen bernama saat Anda memanggil sebuah metode. Sebelumnya, ini harus muncul terakhir dalam daftar argumen pada metode. Ini tentu menjengkelkan terutama ketika Anda lebih suka menempatkan argumen posisional terakhir agar kode lebih mudah dibaca. Sebagai contoh, lihat pemanggilan konstruktor List<T>.generate — sebelumnya, argumen growable harus ditempatkan di posisi terakhir, sehingga mudah terlewat di bawah argumen posisional besar yang berisi generator. Sekarang Anda bisa mengurutkannya sesuai keinginan, sehingga Anda bisa menempatkan argumen bernama kecil terlebih dahulu dan generator ditempatkan di posisi terakhir.

Untuk melihat lebih banyak contoh dari ketiga fitur ini beraksi, lihat contoh terbaru kami untuk enum, super initializer, dan parameter bernama.

Alat produktivitas

Melanjutkan tema produktivitas, kami melakukan beberapa penyempurnaan pada alat inti kami.

Dalam Dart 2.14 kami memperkenalkan package:lints, yang bekerja dengan penganalisis Dart untuk membantu Anda menulis kode Dart yang mencegah kesalahan dan menggunakan gaya canonical yang memungkinkan tinjauan kode yang lebih efektif. Sejak itu, sejumlah lint baru telah tersedia di penganalisis, yang telah kami urutkan dengan cermat dan memilih sepuluh lint baru untuk semua kode Dart, dan dua lint baru khusus untuk kode Flutter. Ini termasuk lint untuk memastikan impor disertakan dalam file pubspec Anda, untuk mencegah penyalahgunaan null check pada parameter tipe, dan memastikan gaya yang konsisten untuk properti turunan. Anda bisa mengupgrade ke lint baru dengan perintah sederhana:

  • Untuk paket Dart:
    dart pub upgrade —-major-versions lints
  • Untuk paket Flutter:
    flutter pub upgrade —-major-versions flutter_lints

SecureSockets biasanya digunakan untuk mengaktifkan soket TCP yang diamankan dengan TLS dan SSL. Sebelum Dart 2.17, men-debug soket ini selama pengembangan memang cukup rumit, karena tidak ada cara untuk memeriksa traffic data yang aman. Kami sekarang telah menambahkan dukungan untuk menetapkan file keyLog. Jika sudah ditetapkan, satu baris teks dalam NSS Key Log Format akan ditambahkan ke file saat kunci TLS baru ditukarkan dengan server. Ini memungkinkan alat penganalisis traffic jaringan (seperti Wireshark) untuk mendekripsi konten yang dikirim melalui soket. Untuk detailnya, lihat dokumen API untuk SecureSocket.connect().

Dokumentasi API yang dihasilkan oleh alat dart doc adalah aset penting bagi kebanyakan developer Dart yang mempelajari API baru. Meskipun API library inti kami telah lama memiliki deskripsi tekstual yang beragam, banyak developer memberi tahu kami bahwa mereka lebih suka mempelajari API dengan membaca kode contoh yang menggunakan API. Dengan Dart 2.17, kami telah merombak total semua library inti utama, menambahkan kode contoh ke 200 halaman teratas yang paling banyak dilihat, sehingga mereka sekarang memiliki kode contoh yang lengkap. Sebagai contoh, bandingkan dokumentasi untuk dart:convert di Dart 2.16 dengan halaman yang diperbarui untuk Dart 2.17; semoga ini membuat dokumentasi lebih mudah dipelajari.

Peningkatan produktivitas tidak hanya datang saat kami menambahkan fitur baru ke platform kami, tetapi juga saat kami membersihkan stack dan menghapus fitur yang tidak lagi digunakan. Ini membantu menjaga area permukaan kami kecil, yang sangat penting terutama bagi developer baru. Untuk itu, kami telah menghapus 231 baris kode yang tidak digunakan lagi dari library dart:io — jika Anda masih menggunakan API yang tidak digunakan lagi ini, Anda bisa melakukan upgrade ke penggantinya dengan dart fix. Kami juga melanjutkan upaya untuk menghapus alat Dart CLI yang tidak digunakan lagi, kali ini kami menghapus alat dartdoc (gunakan dart doc sebagai gantinya), dan alat pub (gunakan dart pub atau flutter pub).

Memperluas integrasi dan dukungan platform kami

Tema inti kedua adalah integrasi dan dukungan platform. Dart adalah bahasa multiplatform sejati. Meskipun kami telah mendukung berbagai platform, kami terus berkembang untuk memastikan bahwa Anda bisa terintegrasi secara mendalam dengan setiap platform yang didukung, dan juga untuk mendukung platform yang muncul.

Dart FFI — mekanisme inti kami untuk interop dengan kode native/C — adalah cara terpopuler untuk mengintegrasikan kode Dart dengan kode platform native yang sudah ada. Di Flutter, ini bisa menjadi cara terbaik untuk membuat plugin yang menggunakan API native dari platform host (seperti API win32 Windows). Di Dart 2.17 dan Flutter 3, kami telah menambahkan template ke alat flutter sehingga sekarang Anda bisa dengan mudah membuat Plugin FFI yang memiliki Dart API yang didukung oleh panggilan dart:ffi ke dalam kode native. Untuk detailnya, lihat pembaruan halaman pengembangan paket dan plugin di flutter.dev.

Untuk mengaktifkan penggunaan FFI pada platform yang memiliki tipe khusus untuk ABI (application binary interface), FFI sekarang mendukung tipe khusus ABI. Sebagai contoh, sekarang Anda bisa menggunakan Long (long dalam C) untuk merepresentasikan integer panjang secara benar dengan ukuran khusus ABI, yang mungkin 32-bit atau 64-bit tergantung arsitektur CPU. Untuk daftar dukungan tipe selengkapnya, lihat daftar “Implementer’’ di halaman API AbiSpecificInteger.

Ketika terintegrasi secara mendalam dengan platform native menggunakan Dart FFI, terkadang Anda perlu menyelaraskan pembersihan memori atau sumber daya lain (port, file, dan sebagainya) yang dialokasikan oleh Dart dan kode native. Ini secara historis sangat rumit, karena Dart adalah bahasa pengumpulan sampah yang secara otomatis menangani pembersihan. Dart 2.17 memecahkan masalah ini dengan memperkenalkan konsep Finalizer, yang mencakup antarmuka penanda Finalizable untuk “menandai” objek yang tidak boleh diselesaikan atau dihapus terlalu dini, dan class NativeFinalizer yang dapat dipasangkan ke objek Dart untuk menyediakan panggilan balik saat objek akan dikumpulkan sampahnya. Bersama-sama, mereka menjalankan kode pembersihan dalam kode native dan Dart. Untuk detailnya, lihat deskripsi dan contoh dalam dokumentasi API untuk NativeFinalizer, atau dokumentasi untuk WeakReferences dan Finalizer untuk dukungan serupa dalam kode Dart biasa.

Dukungan kami untuk mengompilasi Dart ke kode native adalah pengaktif inti untuk membuat aplikasi Flutter memiliki performa startup yang bagus dan rendering yang cepat. Kasus penggunaan kedua adalah kemampuan untuk mengompilasi Dart ke file yang dapat dieksekusi dengan dart compile. File yang dapat dieksekusi ini bisa berjalan mandiri di mesin apa pun tanpa perlu menginstal Dart SDK. Kemampuan baru lain dalam Dart 2.17 adalah dukungan untuk menandatangani file yang dapat dieksekusi, yang memungkinkan penerapan di Windows dan macOS di mana penandatanganan sering kali diperlukan.

Kami juga terus memperluas rangkaian platform yang didukung dengan selalu menjadi yang terdepan dari setiap platform baru yang muncul. RISC-V adalah kumpulan petunjuk inovatif baru untuk prosesor. RISC-V International, sebuah organisasi non-profit global, memiliki spesifikasi RISC-V, membuat kumpulan petunjuk yang bebas dan terbuka. Ini merupakan platform baru, tetapi kami senang dengan potensinya, jadi rilis Linux 2.17.0–266.1.beta (atau yang lebih baru dari saluran beta kami) menyertakan dukungan eksperimental untuk hal ini. Kami ingin mendengar masukan Anda, jadi harap laporkan masalah atau posting tentang pengalaman Anda!

Mulailah gunakan Dart 2.17!

Kami berharap rilis Dart 2.17 hari ini menggairahkan Anda, meningkatkan produktivitas Anda, dan memungkinkan integrasi platform yang lebih banyak untuk aplikasi Anda. Untuk memulai, Anda bisa langsung mendownload rilis Dart 2.17, atau menyematkannya sebagai bagian dari rilis SDK Flutter 3 hari ini.

Kami juga mengundang Anda untuk melihat konten baru yang kami sediakan untuk Google I/O!