Нарешті викотив вкладення файлів у своєму опенсорсному AI-чаті Besidka .
UX вийшов дуже приємним: можна вставити файл з буфера обміну або перетягнути прямо в чат (чи в модальне вікно). Ще я зробив повноцінний файловий менеджер із переглядом сіткою або списком, пошуком і лінивим завантаженням.
Розповім, як влаштована архітектура.
Оскільки застосунок працює на Cloudflare Workers, у мене немає постійного серверного диска. Тому я використовую бакет R2.
Завантажені файли йдуть у R2 і записуються в БД. Файл конвертується для AI через Vercel AI SDK лише за потреби. Головне тут — конвертація відбувається тільки коли вона справді потрібна, а результати кешуються, щоб усе працювало швидко і без зайвої роботи.
Я принципово зробив повноцінний файловий менеджер, бо це дуже зручно — можна перевикористовувати вкладення в нових чатах (або на інших пристроях), не завантажуючи все заново.
Сховище та ліміти (найскладніша частина)
Besidka — опенсорсний проєкт, але водночас крутиться у мене в продакшені, тож довелося подбати про захист від зловживань сховищем.
- Термін зберігання: налаштував крон-джобу у Wrangler, яка щодня чистить файли зі значенням
expireAt(за замовчуванням 30 днів). Це налаштовується через ENV і вимкнено за замовчуванням для тих, хто робить self-host. - Квоти: безкоштовним користувачам за замовчуванням — 20 МБ сховища, плюс ліміти на кількість і розмір файлів в одному повідомленні.
- Перевизначення: ліміти зберігаються в БД, тож я можу вручну зняти ліміти для дружини та друзів (пріоритети 😄).
Ще я підключив трансформацію зображень від Cloudflare, щоб економити місце на великих файлах. Але безкоштовний тариф CF на трансформації доволі скромний, тому безкоштовним користувачам за замовчуванням можна дати 0 трансформацій на весь час, VIP-користувачам — виділити ліміт трансформацій через БД, а ще я тримаю глобальний місячний запобіжник, щоб не вичерпати квоту всього акаунта.
Дуже задоволений тим, що вийшло, але завжди відкритий до критики. Напишіть, що думаєте про такий підхід! 👇
Демо функції вкладення файлів
Повне відео з демо — в оригінальній статті на LinkedIn: Why I built a dedicated file manager for my AI chat app
Мій AI-чат усе ще активно розвивається, але я був би дуже вдячний, якби ви подивилися на вкладення файлів.
- GitHub: github.com/besidka/besidka
- Продакшен: besidka.com