Stevens: Asisten AI yang Bisa Diutak-atik, Dibuat Hanya dengan Satu Tabel SQLite dan Cron Job
(geoffreylitt.com)- Stevens adalah asisten AI pribadi yang merangkum jadwal keluarga, cuaca, surat, dan pengingat setiap pagi lewat Telegram, serta memberi bantuan praktis tanpa agen yang rumit atau RAG
- Intinya adalah satu tabel memori SQLite di atas Val.town dan beberapa cron job, yang meneruskan memori relevan ke konteks LLM untuk membuat briefing
- Memori dengan tanggal dan informasi latar tanpa tanggal disimpan terpisah, lalu briefing pagi memasukkan item untuk seminggu ke depan bersama memori latar yang selalu dibutuhkan
- Google Calendar, API cuaca, OCR USPS Informed Delivery, input Telegram·email, dan fun facts mingguan terhubung sebagai job pengambilan yang mengisi tabel log yang sama
- Alat AI pribadi menjadi lebih berguna saat konteks kehidupan yang tersebar di berbagai aplikasi dikumpulkan ke memori bersama, dan bila skala informasinya kecil serta batas waktunya jelas, struktur sederhana pun cukup untuk memulai
Apa yang dilakukan Stevens
- Stevens adalah asisten AI untuk keluarga yang namanya diambil dari kepala pelayan dalam novel Ishiguro Remains of the Day
- Setiap pagi, Stevens mengirim briefing Telegram yang menyampaikan semua informasi penting untuk hari itu sekaligus
- Jadwal kalender hari itu
- Pratinjau ramalan cuaca
- Surat atau paket yang akan diterima
- Pengingat yang diminta pengguna untuk dilacak
- Briefing ditulis dengan gaya bahasa kepala pelayan yang formal
- Selain briefing harian, pengguna juga bisa berinteraksi langsung dengan Stevens
- Meneruskan email yang berisi informasi penting
- Meninggalkan pengingat lewat chat Telegram
- Mengajukan pertanyaan di Telegram
- Meski strukturnya sederhana, sebagai asisten pribadi keluarga ia sudah dinilai lebih berguna daripada Siri
Struktur sederhana yang dijalankan di atas Val.town
- Seluruh sistem di-host di Val.town
- Val.town menyediakan fungsi dasar yang dibutuhkan proyek ini di satu tempat
- Penyimpanan SQLite
- Penanganan permintaan HTTP
- Cron job terjadwal
- Email masuk dan keluar
- Stevens membaca isi untuk briefing pagi dari log yang berperan sebagai “buku catatan kepala pelayan”
- Buku catatan ini adalah rekaman semua hal yang diketahui Stevens, dan isinya bisa dilihat dari layar admin
Membuat briefing dengan satu tabel memori
- Implementasi nyata buku catatan ini adalah satu tabel SQLite dengan beberapa kolom
- Setiap entri log berisi teks, dan bila perlu diberi tanggal yang diperkirakan relevan
- Entri tanpa tanggal diperlakukan sebagai informasi latar umum dan selalu dimasukkan ke konteks
- Saat penyiapan awal, memori latar bisa dibuat melalui intake interview di Telegram
- Alur pembuatan briefing pagi sederhana
- Cron job dijalankan
- Claude API dipanggil untuk menulis kalimat pembaruan
- Teks hasilnya dikirim ke thread Telegram
- Konteks yang dikirim ke model terdiri dari dua jenis
- Entri log bertanggal untuk satu minggu ke depan
- Entri latar tanpa tanggal
Job pengambilan yang mengisi log yang sama
- Berbagai job pengambilan data mengisi tabel SQLite yang sama
- Saat ini, sumber entri log adalah sebagai berikut
- Mengambil data setiap jam dari Google Calendar API
- Memeriksa ramalan cuaca wilayah setiap jam melalui API cuaca
- Saat email USPS Informed Delivery diteruskan, Stevens menggunakan Claude untuk melakukan OCR pada gambar pemindaian surat
- Pesan Telegram dan email yang masuk dapat membuat entri log
- Setiap minggu, “fun facts” ditambahkan ke log untuk memberi warna pada pembaruan harian berikutnya
- Strukturnya memudahkan penambahan job pengambilan baru
- Job pengambilan bisa berupa proses apa pun yang menambah atau mengubah memori di log
- Isi memori cukup berupa teks bebas yang nantinya akan dikirim kembali ke LLM
Mengapa bisa mulai dari memori sederhana
- Alat AI pribadi menjadi berguna saat dapat mengakses konteks yang lebih luas dari berbagai sumber informasi lain
- Dengan mengetahui kalender dan ramalan cuaca, chatbot sederhana pun menjadi asisten yang lebih praktis
- ChatGPT belakangan menambahkan memori percakapan masa lalu, tetapi masih banyak informasi yang tidak tersimpan di dalam silo itu
- Bentuk jangka panjang perangkat lunak pribadi berbasis AI kemungkinan bukan lebih banyak silo aplikasi, melainkan alat-alat kecil yang berjalan di atas kumpulan konteks bersama tentang kehidupan pengguna
- Use case Stevens terbatas dan informasinya secara alami memiliki batas waktu, sehingga konteks relevan yang akan dikirim ke LLM mudah ditemukan
- Jendela konteks panjang pada model terbaru juga memungkinkan pendekatan yang sederhana
- Jika skala informasi membesar, RAG atau akses memori yang lebih kompleks mungkin diperlukan, tetapi tidak perlu memulai dengan kerumitan sejak awal
Proyek pribadi yang mudah mengubah gaya bahasa dan UI
- Awalnya, Stevens memiliki gaya bahasa datar seperti produk Apple atau Google
- Mengubahnya menjadi gaya bahasa kepala pelayan formal cukup dengan mengedit beberapa baris prompt
- Dashboard admin juga dibuat agar terasa seperti video game
- Aset gambar dibuat di ChatGPT, dan UI dikodekan secara vibe coding dengan Cursor dan Claude 3.7 Sonnet
- Dengan sedikit usaha tambahan, proyek ini bisa dibuat jauh lebih menyenangkan
Cara melihatnya sendiri
- Stevens bukan produk siap pakai, melainkan proyek pribadi
- Kodenya bisa dilihat dan di-fork di stevensDemo
- Pola berupa satu tabel memori dan sekumpulan cron job yang dapat diperluas ini juga bisa diterapkan pada alat pribadi berguna lainnya
- Saat mengedit kode, disarankan memakai editor AI pilihan Anda dan Val Town CLI untuk sinkronisasi dengan filesystem lokal
1 komentar
Komentar di Hacker News
Entah karena kegunaannya yang murni, atau karena gaya bicara “Proper English Butler” yang berlebihan, saya benar-benar menyukainya
Yang lebih menarik perhatian adalah mengapa kita membaca hal seperti ini dari blog seorang engineer cerdas, bukan dari peluncuran produk Apple atau Google. Bahkan dengan syarat memakai ekosistem tertutup mereka sendiri sampai email, kalender, dan ponsel, sungguh memalukan bahwa kedua perusahaan itu bahkan belum bisa merilis sekumpulan fitur kecil seperti ini. Itu hanya tertutupi oleh kurangnya ambisi mereka dalam menerapkan teknologi AI pada area yang sudah hampir menjadi “masalah yang terselesaikan”, seperti ringkasan dan tanya-jawab
Jika ada peluang untuk mengguncang duopoli yang tumpul dan antikompetitif ini, rasanya jelas akan terkait dengan AI
Sesekali kita membaca di koran tentang dua programmer di garasi yang diubah yang membuat program penting yang melampaui upaya terbaik tim besar, dan setiap programmer siap mempercayai cerita seperti itu. Karena mereka tahu bahwa program apa pun bisa dibuat jauh lebih cepat daripada produktivitas 1000 baris per tahun dari tim industri
Lalu mengapa semua tim pemrograman industri tidak digantikan oleh duo garasi yang berdedikasi? Kita harus melihat apa yang sebenarnya diproduksi
Data pribadi yang masuk ke database yang ditangani software yang sangat eksperimental mungkin bukan masalah besar bagi pengembang ini, tetapi bagi perusahaan seperti Google atau Apple itu bisa menjadi risiko serius
Tim HA setiap bulan benar-benar merilis pembaruan yang berguna, misalnya fitur yang memungkinkan asisten menanyakan sesuatu terlebih dahulu
Menurut saya Google dan Apple punya masalah besar dalam kolaborasi antar-tim produk, dan kolaborasi dengan perusahaan eksternal nyaris mustahil
Yang ingin dilakukan perusahaan raksasa hanyalah memeras telur dari angsa mereka sendiri lebih cepat
Ini membuat saya membayangkan bagaimana kalau program asisten utilitas kecil seperti Stevens milik saya punya akses ke kotak masuk email
Saya punya utilitas kecil yang bisa disuruh mengambil cuaca atau menjalankan perintah yang sering dipakai dan spesifik untuk sistem saya. Praktis, dan kalau mau bisa dijalankan berkala dengan cron
Jika utilitas ini punya kotak email sendiri, kita bisa mengirim informasi lewat email, lalu AI mem-parse informasi itu dan membalas atau mengirim pesan baru. Itu akan jadi cukup berguna. Tanpa mengacaukan kotak email pribadi saya, cukup membaca email, memasukkannya ke penyimpanan internal, lalu menghapus pesannya
Agen saya berhasil menyelesaikan 18 tantangan. Tulisan setelah final ada di sini
https://msrc.microsoft.com/blog/2025/03/announcing-the-winne...
Dengan ini kita bisa membuat segala macam otomasi. Bisa dimasukkan ke large language model untuk langsung diberi tag atau diarsipkan. Saya memberi label tertentu pada email penting; kalau orang itu membalas, itu benar-benar penting, jadi saya ingin segera tahu, maka saya hubungkan dengan Twilio agar saya mendapat panggilan telepon. Biayanya sekitar 20 sen per bulan
Saya memakai ini untuk menulis jurnal. Saya membuat sistem kecil yang mengirim email kepada saya setiap hari, dan kalau saya membalasnya, respons itu dikirim ke sebuah halaman dan disimpan ke database
https://www.val.town/x/geoffreylitt/stevensDemo/code/importe...
Sepertinya cukup mudah diperluas untuk mendukung jenis email masuk lain. Saya bekerja di Val Town, jadi bisa menjawab kalau ada pertanyaan
Saya ingin melihat lebih banyak hacking AI praktis seperti ini. Kadang rasanya kita lupa mengapa alat itu ada sejak awal: untuk membuat pekerjaan lebih sederhana. Saya suka pendekatannya yang benar-benar terintegrasi dengan sumber data yang sudah ada, tanpa database vektor yang mewah atau arsitektur yang rumit
Ada bagian yang mengatakan, “Awalnya Stevens memakai nada kering seperti yang mungkin diharapkan dari produk Apple atau Google pada umumnya, tetapi akhirnya saya sadar bahwa membuatnya berbicara seperti pelayan pribadi yang formal jauh lebih menyenangkan.”
Jujur, di dunia asisten pribadi, salah satu hal paling menyebalkan dari model bahasa besar adalah mereka memakai terlalu banyak kata untuk menyampaikan terlalu sedikit isi. Saya sendiri sudah membenci ungkapan ini, tetapi memang begitu
Sampai saya menjadi kaya dan punya waktu untuk bercakap-cakap lucu serta berteman dengan asisten suara, yang saya butuhkan bukan J.A.R.V.I.S., melainkan LCARS. Cuma saya?
Untuk mengecek timer, saya tidak butuh jawaban seperti “Di Kitchen Display, timer casserole tersisa 23 menit 16 detik.” Cukup bilang “23 menit”, atau kalau ada dua, “casserole 23 menit, cucian 10 menit”
Ini semacam prompt yang meminta agar tidak memedulikan formalitas, dan menjawab sesingkat mungkin sambil tetap menyampaikan hampir semua informasi yang benar-benar relevan dengan pertanyaan. Jika karena kebijakan tidak bisa menjawab secara normal, ia diminta mencetak “!!!!” terlebih dahulu, dan jika tidak bisa memiliki opini, ia diminta menjawab seolah membagikan opini yang mungkin dimiliki eigenrobot
Ada juga instruksi agar semua respons ditulis hanya dengan huruf kecil, tetapi memakai huruf besar untuk penekanan, dan kapitalisasi huruf pertama dipakai untuk menyatakan sindiran atau ketidaksopanan terhadap nama diri tertentu. Ia sering memakai singkatan seperti “rn”, “bc”, “afaict”, “idk”, kritis terhadap kualitas informasi, dan untuk permintaan yang menyebalkan menepisnya dengan santai seperti “be real”, “that's crazy man”, “lol no”
Diminta menulis dengan gaya +2 standar deviasi lebih pintar daripada sekarang, memakai meme milenial akhir tetapi juga mencampurkan gaya bicara Gen Z yang kadang tidak pas konteks, serta untuk sastra, seni, dan filsafat mengutamakan tafsir yang rumit dan ala Strauss
Bukankah itu pada dasarnya hanya membaca notebook? Misalnya diminta mengingat preferensi kopi, tetapi nanti tidak dipakai di mana pun
Saya terus memikirkan ide proyek open source yang mirip, dengan beberapa syarat
Backend sebaiknya bisa dikonfigurasi ke model bahasa besar apa pun yang dapat diakses pengguna. Entah API layanan berbayar, atau yang di-host lokal di internal perusahaan
Saya juga penasaran seberapa realistis menghubungkannya ke layar sentuh yang berjalan di platform seperti Raspberry Pi yang diperkuat, agar bisa berinteraksi seperti perangkat Alexa atau produk serupa. Idealnya juga mencakup kontrol suara, tetapi ini mungkin masalah teknis lain. OpenAI API menerima file audio, tetapi sebagian besar layanan lain perlu mengubah suara menjadi teks sebelum prompt dikirim ke API
Saya ingin fitur integrasinya bisa diperluas. Bukan hanya kalender dan cuaca, tetapi juga Homebridge, Spotify, dan sebagainya. Saya sedang mempertimbangkan apakah MCP server adalah jalur yang tepat untuk itu
Saat ini saya tidak punya banyak waktu untuk dicurahkan ke proyek seperti ini, tetapi jika ada yang bergerak ke arah ini, saya ingin ikut berkontribusi
Berjalan lokal, tetapi memakai API key untuk beberapa model bahasa besar. Saat ini saya jauh lebih menyukai QwQ-32B yang di-host di Groq. Sangat cepat dan cukup pintar. Saya memakai model yang berbeda untuk tiap tool
Saat ini dapat membuat tiga jenis dokumen yang saya butuhkan untuk pekerjaan sehari-hari: laporan kerja, faktur, dan lembar waktu untuk regulasi. Ada integrasi cuaca juga, bisa mem-parsing faktur dan membuat kode QR agar pembayaran mobile banking lebih mudah, serta bekerja dengan kalender saya
Berikutnya saya berencana menambahkan integrasi email. Namun saya ingin melakukannya dengan benar. Artinya saya butuh email IMAP yang bisa disinkronkan dan diindeks secara lokal. Ini bahkan bisa berkembang menjadi klien email desktop yang benar-benar layak dipakai. Karena yang ada sekarang semuanya buruk, kita lihat saja nanti
Jika ada kumpulan fitur umum seperti penyimpanan dan pencarian memori, integrasi antarmuka chat dan email, sinkronisasi kalender dan Notion, serta notifikasi, lalu dibuat menjadi framework open source, itu akan sangat kuat
Saya juga tidak punya waktu untuk menjalankannya, tetapi bersedia membantu dan membayar. Saat ini saya mengerjakan hal lain seperti database/object storage terdistribusi yang local-first, dan sepertinya bisa dipakai sebagai penyimpanan mirip OrbitDB, tetapi belum dalam kondisi siap pakai
Sejauh ini saya merasa frustrasi karena pilihannya hanya memakai antarmuka chat yang sangat terbatas, atau membangun sendiri framework agen lengkap seperti di tulisan asli
Belakangan ini saya bereksperimen dengan cara mengakali rentang ideal token konteks, yaitu di bawah 20 ribu token, dan pada 2.5 di bawah 50 ribu token
Pada dasarnya ini adalah “kompresi konteks” manual. Model bahasa besar menyimpan data secara permanen ke database sesuai skema yang ketat, lalu ketika konteks saat ini mulai keluar dari rentang ideal, ia merangkumnya dan menyerahkannya ke instance baru dengan konteks baru. Saya masih belum sepenuhnya yakin apakah rangkuman ini harus berlanjut seperti jurnal, atau retrospektif seperti rangkuman penutup
Pada model penalaran, ini cukup efektif. Penalaran memang memakan konteks sangat banyak, tetapi pada saat yang sama juga menghasilkan “dokumen ringkasan” yang sangat bagus. Jadi kita bisa mendapatkan sebagian imbalan dari penalaran tanpa mengorbankan konteks lezat di bawah 50 ribu
Database berfungsi semacam fallback jika rangkuman melewatkan detail penting, atau seperti retrieval-augmented generation. Namun model harus menyadarinya dan mengambil konteks dari database
Saat ini saya mencobanya untuk membuat manajemen inventaris dan agen optimisasi BOM terhadap database sekitar 10 ribu komponen dan material terpisah
Hal-hal besar yang terlintas adalah caching jangka panjang murah, terobosan kompresi, dan pemrosesan diferensial. Saya penasaran apakah ada cara untuk hanya menggunakan bagian yang diperlukan dari konteks input yang sudah di-cache
Di jalur yang mirip, saya baru saja membuat sesuatu bernama Jeeves. Polesannya memang sedikit lebih minim, tapi dirakit dengan sangat cepat. Stack-nya Claude Desktop, Projects, MCP untuk Notion dan Todoist, dan untuk upgrade berikutnya saya sedang melirik penjelajahan email dan WhatsApp
Ini dibuat untuk mendukung alur produktivitas konsultasi dan startup. Database Notion-nya berisi beberapa database untuk klien, proyek, rapat, dan Jeeves. Untuk database Jeeves, saya hanya memberi sedikit instruksi lalu membiarkan Jeeves menulis sendiri. Misalnya, ia memakai databasenya sendiri untuk melacak pekerjaan memigrasikan semua notulen rapat lama ke struktur baru
Di database saya, saya memasukkan praktik terbaik penggunaan. Misalnya, notulen rapat bentuknya seperti ini, dokumen one-page klien bentuknya seperti ini, informasi yang menghubungkan semuanya adalah ini, dan tugas dikelola seperti ini. Lalu, dengan prompt perluasan teks Alfred untuk jenis rapat yang umum, saya memasukkan transkrip ke chat baru, dan ia mengurus sisanya
Ia mengubah transkrip menjadi notulen rapat, membuat tugas, mengonfirmasi dengan saya, merapikannya sekali lagi, lalu melalui MCP menaruh semuanya dengan rapi di Notion dan Todoist
Proses ini juga didokumentasikan sendiri. Karena ada bug di Todoist MCP, saya menginstruksikan Jeeves untuk menjalankan berbagai kemungkinan use case, memahami batasan dan kekuatannya, mendokumentasikannya, lalu menyimpannya di database Jeeves. Setelah itu bisa dipanggil kembali sebagai konteks
Sayang memang tidak ada fitur cron, tapi jujur saja, memasukkan prompt yang sudah disiapkan ke Claude sekali sehari bukan hal yang terlalu sulit
Yang membuat tulisan ini terasa sangat nyata adalah bahwa Apple benar-benar lengah
Hari ini saat mengemudi, saya meminta Siri, “telepon orang yang terakhir saya kirimi SMS,” karena ingin membalas seseorang
Apakah mengejutkan bahwa Siri tidak bisa? Sekarang sudah tidak terlalu mengejutkan. Tetap saja, mengecewakan bahwa ada kesenjangan sebesar ini antara Siri dan model bahasa besar yang paling kurang sekalipun
Itu saran yang cukup bodoh. Kalau perlu, saya bisa melakukannya sendiri
Awalnya saya kira mereka memakai database sqlite untuk prediksi token berikutnya
Untuk yang lain, sebenarnya mereka memakai Claude
Keren. Saya juga membuat sesuatu yang mirip memakai mcp.run dan task
https://docs.mcp.run/tasks/tutorials/telegram-bot
Untuk memori, walau belum terlihat di tutorial ini, saya membuat pantry [0], dan juga membuat servlet untuk itu [1]. Lalu saya mengubah prompt agar terlebih dahulu memeriksa apakah ada percakapan untuk chat ID yang diberikan, lalu menyimpan hasilnya di sana
Hal bagusnya, Anda bisa menambahkan servlet apa pun ke registry dan membuat bot sekuat yang Anda inginkan
[0] https://getpantry.cloud/
[1] https://www.mcp.run/evacchi/pantry
Sebagai catatan, saya bekerja di Dylibso :o)