Як mintbot поводиться з файлами¶
Коли ви надсилаєте своєму агенту mintbot фотографію, документ, голосове повідомлення, таблицю, скріншот чи PDF — через Telegram, вебпанель або API — файл не проходить через центральну інфраструктуру mintbot дорогою до мовної моделі. Він приземляється просто на VPS вашого власного агента, залишається там стільки, скільки ви захочете, а LLM отримує перетворену копію, оптимізовану саме під нього.
Це тихе проєктне рішення з гучними наслідками. Варто його розгорнути, бо це одне з місць, де mintbot найсильніше розходиться зі споживчим LLM-чатом.
Потік від початку до кінця¶
-
Завантаження приходить на VPS агента. Фотографія з Telegram, PDF, перетягнутий у вебпанель, голосова нотатка, скріншот, вставлений у чат. Локальний API агента приймає байти, нюхає магічний заголовок, щоб зрозуміти, що це насправді за файл (телефони і браузери на диво часто маркують файли неправильно), рахує SHA-256 і записує файл у каталог
/var/lib/mintbot-agent/uploads/<shard>/<sha256>.<ext>на VPS вашого власного агента. У локальний каталог потрапляє рядок із джерелом (telegram / panel / api), ID завантажувача, MIME-типом і початковим іменем файлу. -
Оригінал священний. З цього моменту всередині mintbot ніхто збережений файл більше не змінює. Адаптери, що готують його для LLM, видають лише робочі копії — зменшені JPEG, перекодований текст, витягнуті мініатюри. Байт у байт оригінал залишається на диску, доки ви самі не видалите його через файловий менеджер агента. Немає центрального сховища, немає таймера зберігання, немає витоків між агентами: VPS кожного агента знає лише про завантаження свого власника.
-
Модель отримує оптимізовану для LLM версію. Коли агент вирішує показати файл LLM, маленький диспетчер за MIME-типом і розширенням обирає потрібний адаптер, і адаптер видає блоки контенту, які модель може прочитати:
Адаптер Що обробляє Вихід Image JPG, PNG, WebP, GIF, HEIC (iPhone), AVIF і все інше, що вміє відкривати Pillow Зменшено до 1568 px по довшому боку, перекодовано в JPEG q85, base64-inline у контексті моделі PDF .pdfдо 32 MBBase64-inline як нативний PDF (моделі Anthropic читають його напряму) Text .md,.csv,.json,.yaml, вихідний код (.py,.js,.ts,.go,.rs, …), логи, дифиUTF-8 декодовано (з відкатом на latin-1), inline текстом до ліміту за розміром Audio .mp3,.ogg,.opus,.m4a,.wav,.flacГолосові з Telegram бот уже транскрибує inline; прямі завантаження поки що отримують плейсхолдер, Whisper STT прийде наступною хвилею Video .mp4,.mov,.webm,.mkvПоки що плейсхолдер; витяг keyframe через ffmpeg + транскрипція звуку прийдуть наступною хвилею Office docs .docx,.xlsx,.pptx,.odt,.ods,.odpПоки що плейсхолдер; нативне витягання тексту (python-docx / openpyxl / python-pptx) прийде наступною хвилею Unknown Усе інше Текстовий плейсхолдер: «користувач долучив файл <mime>, він збережений на диску з upload ID<id>» — щоб модель могла принаймні поміркувати про те, що було надісланоКожне перетворення кешується поруч з оригіналом як
<sha256>.cache/v<N>.json, тож удруге, коли модель потребує того ж файлу, завантаження відбувається миттєво. Підняття версії адаптера автоматично анулює кеш. -
У контекст моделі не потрапляють URL, що закінчуються. Коли зображення або PDF іде до LLM, воно надсилається base64-inline у тому ж ході — без URL, який пізніше може стати 404, без підписаного посилання з таймером. Для більших файлів, де моделі потрібен лише вказівник, URL внутрішній —
https://agent<id>.<domain>/<panel_token>/api/local/uploads/<upload_id>/raw— захищений panel token'ом вашого власного агента і дійсний доти, доки файл лежить на диску.
Чому це виграє у споживчого LLM-чату¶
Коли ви завантажуєте фотографію в ChatGPT або PDF у Claude.ai, файл потрапляє в сховище провайдера, прив'язаний до цієї розмови, і політика зберігання провайдера вирішує, коли він зникне. Через певний час файлу вже немає, навіть якщо ви ще бачите розмову, в якій він був. Перехід з одного провайдера на інший означає починати з нуля.
Одна типова пастка Telegram-бота наочно показує контраст. Сам Telegram зберігає для кожної фотографії вічно дійсний file_id, але сторонні боти, що запитують файл за Telegram file_id, отримують тимчасовий URL, який закінчується через 24 години. Старі боти, що посилаються на вчорашню фотографію, віддають 404. mintbot вирішує це раз і назавжди: при першій появі Telegram-файлу він перекачує байти через вічно дійсний file_id і копіює їх в архів вашого агента. З цього моменту фотографія — ваша.
З такого устрою випливає три речі:
- Файли належать вам, а не провайдеру LLM. Наступного місяця поміняєте Claude на GPT-5 — історія файлів піде з вами, недоторкана, бо лежить на вашому VPS, а не в сховищі провайдера.
- Можна перепитати пізніше. «Три місяці тому ти аналізував для мене договір — можеш порівняти його з цим новим чернеткою?» працює, бо оригінал ще на диску. У споживчому чаті старий файл зазвичай уже зник.
- Модель завжди отримує версію, яку здатна використати найкраще. Vision-моделі отримують зменшений JPEG, текстові читачі — UTF-8, PDF-читачі — нативний PDF. Телефони можуть вантажити HEIC, і це просто працює — плагін HEIF Pillow підвантажується на старті, а нюхач магічних байтів ловить телефони, що позначають завантаження як
application/octet-stream.
Де керувати своїми файлами¶
У верхній панелі вебінтерфейсу агента є файловий менеджер. Він показує весь VPS агента, а архів завантажень у каталозі /var/lib/mintbot-agent/uploads/ — це та частина, яку наповнюють ваші розмови. Звідти можна:
- Перейменовувати, видаляти або переміщувати завантажені файли
- Переглядати їх за датою, джерелом або іменем файлу
- Перетягувати нові завантаження (chunked, підтримує файли в кілька гігабайт)
- Редагувати невеликі текстові файли inline
Видалення файлу з панелі прибирає і сам blob, і рядок у каталозі. Агент більше не зможе показати його LLM. Саме це і робить оригінал «вашим»: право видалення лише у вас.
Підсумок¶
Більшість LLM-чат-продуктів ставляться до ваших завантажень як до ефемерного контексту розмови. mintbot ставиться до них як до ваших даних — збережених на вашому VPS, у вашій власності, на запит перетворюваних саме в ту форму, яку модель цього ходу зможе використати найкраще. Багато з найцікавіших можливостей mintbot стоять саме на цьому фундаменті.