Перейти до вмісту
Статті

Навіщо я зробив окремий файловий менеджер для свого AI-чату

Як я додав вкладення файлів у свій опенсорсний AI-чат — архітектура на R2, ліміти сховища та трансформація зображень.

1 хв читання ai cloudflare r2 workers oss файли
Логотип Besidka — рожева хмаринка-бульбашка з очима та напис besidka на рожевому тлі

Нарешті викотив вкладення файлів у своєму опенсорсному AI-чаті Besidka .

UX вийшов дуже приємним: можна вставити файл з буфера обміну або перетягнути прямо в чат (чи в модальне вікно). Ще я зробив повноцінний файловий менеджер із переглядом сіткою або списком, пошуком і лінивим завантаженням.

Розповім, як влаштована архітектура.

Оскільки застосунок працює на Cloudflare Workers, у мене немає постійного серверного диска. Тому я використовую бакет R2.

Завантажені файли йдуть у R2 і записуються в БД. Файл конвертується для AI через Vercel AI SDK лише за потреби. Головне тут — конвертація відбувається тільки коли вона справді потрібна, а результати кешуються, щоб усе працювало швидко і без зайвої роботи.

Я принципово зробив повноцінний файловий менеджер, бо це дуже зручно — можна перевикористовувати вкладення в нових чатах (або на інших пристроях), не завантажуючи все заново.

Сховище та ліміти (найскладніша частина)

Besidka — опенсорсний проєкт, але водночас крутиться у мене в продакшені, тож довелося подбати про захист від зловживань сховищем.

  • Термін зберігання: налаштував крон-джобу у Wrangler, яка щодня чистить файли зі значенням expireAt (за замовчуванням 30 днів). Це налаштовується через ENV і вимкнено за замовчуванням для тих, хто робить self-host.
  • Квоти: безкоштовним користувачам за замовчуванням — 20 МБ сховища, плюс ліміти на кількість і розмір файлів в одному повідомленні.
  • Перевизначення: ліміти зберігаються в БД, тож я можу вручну зняти ліміти для дружини та друзів (пріоритети 😄).

Ще я підключив трансформацію зображень від Cloudflare, щоб економити місце на великих файлах. Але безкоштовний тариф CF на трансформації доволі скромний, тому безкоштовним користувачам за замовчуванням можна дати 0 трансформацій на весь час, VIP-користувачам — виділити ліміт трансформацій через БД, а ще я тримаю глобальний місячний запобіжник, щоб не вичерпати квоту всього акаунта.

Дуже задоволений тим, що вийшло, але завжди відкритий до критики. Напишіть, що думаєте про такий підхід! 👇

Демо функції вкладення файлів

Файловий менеджер у Besidka: використано 92,9 КБ із 20 МБ, вкладки вибору й завантаження файлів, пошук, перегляд сіткою або списком

Повне відео з демо — в оригінальній статті на LinkedIn: Why I built a dedicated file manager for my AI chat app

Мій AI-чат усе ще активно розвивається, але я був би дуже вдячний, якби ви подивилися на вкладення файлів.