Lewati ke isi

Cara mintbot menangani file

Saat Anda mengirim foto, dokumen, pesan suara, spreadsheet, tangkapan layar, atau PDF ke agen mintbot Anda — lewat Telegram, panel web, atau API — file itu tidak melewati infrastruktur pusat mintbot dalam perjalanannya ke model bahasa. File langsung mendarat di VPS milik agen Anda sendiri, tetap di sana selama yang Anda mau, dan LLM menerima salinan hasil transformasi yang dioptimalkan untuknya.

Ini keputusan desain yang terlihat sepele, tetapi dampaknya besar. Hal ini layak dijelaskan secara rinci, karena di sinilah salah satu perbedaan terbesar antara mintbot dan chat LLM konsumen.

Alurnya, dari awal sampai akhir

  1. Unggahan tiba di VPS agen. Foto dari Telegram, PDF yang diseret ke panel web, memo suara, tangkapan layar yang ditempel ke obrolan. API lokal agen menerima byte-nya, membaca magic bytes di awal file untuk mengetahui jenis file yang sebenarnya (ponsel dan browser ternyata cukup sering salah memberi label), membuat hash SHA-256, lalu menuliskannya ke /var/lib/mintbot-agent/uploads/<shard>/<sha256>.<ext> di VPS milik agen Anda sendiri. Satu baris dicatat di katalog lokal berisi sumber (telegram / panel / api), ID pengunggah, tipe MIME, dan nama file asli.

  2. File asli tidak pernah diubah. Sejak titik ini, tidak ada apa pun di dalam mintbot yang mengubah file yang tersimpan. Adapter yang menyiapkannya untuk LLM hanya menghasilkan salinan kerja — JPEG yang diperkecil, teks hasil konversi, thumbnail yang diekstrak. File asli yang identik byte demi byte tetap di disk sampai Anda menghapusnya lewat pengelola berkas agen. Tidak ada bucket pusat, tidak ada batas waktu penyimpanan, tidak ada kebocoran antaragen: setiap VPS agen hanya mengetahui unggahan milik pemiliknya sendiri.

  3. Model mendapat versi yang dioptimalkan untuk LLM. Saat agen memutuskan untuk menunjukkan file ke LLM, sebuah dispatcher kecil memilih adapter yang tepat berdasarkan tipe MIME dan ekstensi, lalu adapter menghasilkan blok konten yang bisa dibaca model:

    Adapter Menangani Keluaran
    Gambar JPG, PNG, WebP, GIF, HEIC (iPhone), AVIF, dan format lain yang bisa dibuka Pillow Diperkecil hingga sisi terpanjang 1568 px, dienkode ulang sebagai JPEG q85, disisipkan sebagai base64 di konteks model
    PDF .pdf ≤ 32 MB Disisipkan sebagai base64 dalam bentuk PDF asli (model Anthropic membacanya langsung)
    Teks .md, .csv, .json, .yaml, kode sumber (.py, .js, .ts, .go, .rs, …), log, diff Didekode sebagai UTF-8 (cadangan latin-1), disisipkan sebagai teks hingga batas ukuran tertentu
    Audio .mp3, .ogg, .opus, .m4a, .wav, .flac Pesan suara Telegram sudah ditranskripsikan langsung oleh bot; unggahan langsung saat ini mendapat placeholder, dan STT Whisper menyusul di tahap berikutnya
    Video .mp4, .mov, .webm, .mkv Untuk sementara berupa placeholder; ekstraksi keyframe ffmpeg + transkrip audio menyusul di tahap berikutnya
    Dokumen Office .docx, .xlsx, .pptx, .odt, .ods, .odp Untuk sementara berupa placeholder; ekstraksi teks bawaan (python-docx / openpyxl / python-pptx) menyusul di tahap berikutnya
    Tidak dikenal Format lainnya Placeholder teks: "pengguna melampirkan file <mime>, file itu tersimpan di disk dengan ID unggahan <id>" — jadi model setidaknya bisa memahami apa yang dikirim

    Setiap hasil transformasi di-cache di samping file aslinya di <sha256>.cache/v<N>.json, jadi saat model membutuhkan file itu untuk kedua kalinya, file langsung termuat. Menaikkan versi adapter otomatis membatalkan cache.

  4. Tidak ada URL kedaluwarsa di konteks model. Saat gambar atau PDF dikirim ke LLM, file itu disisipkan sebagai base64 dalam giliran yang sama — tidak ada URL yang bisa berubah menjadi 404 di kemudian hari, tidak ada tautan bertanda tangan dengan batas waktu. Untuk file yang lebih besar, ketika model hanya memerlukan penunjuk, URL-nya berupa alamat internal https://agent<id>.<domain>/<panel_token>/api/local/uploads/<upload_id>/raw — dilindungi token panel milik agen Anda sendiri, dan berlaku selama file masih ada di disk.

Mengapa ini lebih baik daripada pengalaman chat LLM konsumen

Saat Anda mengunggah foto ke ChatGPT atau PDF ke Claude.ai, file itu masuk ke penyimpanan milik penyedia, terlampir pada percakapan itu, dan kebijakan retensi penyedialah yang menentukan kapan file itu hilang. Setelah usia tertentu, file itu lenyap, meskipun Anda masih bisa melihat percakapan tempat file itu berada. Beralih dari satu penyedia ke penyedia lain berarti mulai dari nol.

Satu jebakan umum pada bot Telegram memperjelas perbedaannya. Telegram sendiri menyimpan file_id permanen untuk setiap foto, tetapi bot pihak ketiga yang mengambil file_id Telegram mendapat URL sementara yang kedaluwarsa setelah 24 jam. Bot lama yang merujuk foto kemarin akan menampilkan 404. mintbot mengatasinya sekali untuk selamanya: saat pertama kali melihat sebuah file Telegram, mintbot mengambil ulang byte-nya melalui file_id yang berlaku selamanya dan menyalinnya ke arsip agen Anda. Sejak saat itu, foto tersebut milik Anda.

Ada tiga konsekuensi dari desain ini:

  • File adalah milik Anda, bukan milik penyedia LLM. Beralih dari Claude ke GPT-5 bulan depan, dan riwayat file Anda ikut pindah, utuh, karena tersimpan di VPS Anda — bukan di bucket milik vendor.
  • Anda bisa bertanya lagi nanti. "Tiga bulan lalu Anda menganalisis sebuah kontrak untuk saya — bisakah Anda membandingkannya dengan draf baru ini?" bisa dilakukan, karena file aslinya masih ada di disk. Dengan chat konsumen, file lama biasanya sudah hilang.
  • Model selalu mendapat versi yang paling bisa ia manfaatkan. Model vision mendapat JPEG yang sudah diperkecil, pembaca teks mendapat UTF-8, pembaca PDF mendapat PDF asli. Ponsel bisa mengunggah HEIC dan semuanya langsung berfungsi — plugin HEIF milik Pillow dimuat saat startup, dan pendeteksi magic byte mengenali ponsel yang salah melabeli unggahan sebagai application/octet-stream.

Tempat mengelola file Anda

Panel web agen menyediakan pengelola berkas di bilah atas. Pengelola berkas ini bisa menjelajahi seluruh VPS agen, dan arsip unggahan di /var/lib/mintbot-agent/uploads/ adalah bagian yang diisi oleh percakapan Anda. Dari sana Anda bisa:

  • Mengganti nama, menghapus, atau memindahkan file yang diunggah
  • Menelusurinya berdasarkan tanggal, sumber, atau nama file
  • Menyeret dan melepas unggahan baru (dikirim dalam potongan-potongan, jadi tidak ada batas ukuran tetap — Anda bisa mengunggah file yang sangat besar, hingga sebesar ruang disk kosong di VPS Anda)
  • Mengedit file teks kecil langsung di tempat

Karena unggahan dikirim dalam potongan-potongan dan langsung mendarat di VPS Anda sendiri, satu-satunya batas ukuran file adalah disk Anda — tidak ada batas yang ditetapkan mintbot. Video berukuran beberapa gigabyte, dataset, atau image disk bisa diunggah tanpa masalah selama drive masih punya ruang; jika ruangnya menipis, Anda bisa memperbesar VPS atau membersihkan file lama dari panel yang sama.

Menghapus file dari panel akan menghapus blob sekaligus baris katalognya. Agen tidak akan bisa lagi menyajikannya ke LLM. Itulah yang membuat file asli benar-benar "milik Anda": hanya Anda yang berwenang menghapusnya.

Intinya

Kebanyakan produk chat LLM memperlakukan unggahan Anda sebagai konteks percakapan yang sementara. mintbot memperlakukannya sebagai data Anda — tersimpan di VPS Anda, dimiliki oleh Anda, dan diubah formatnya sesuai kebutuhan menjadi bentuk apa pun yang diperlukan model pada giliran itu. Sebagian besar kemampuan mintbot yang lebih menarik dibangun di atas fondasi ini.