Перейти до змісту

Як mintbot поводиться з файлами

Коли ви надсилаєте своєму агенту mintbot фотографію, документ, голосове повідомлення, таблицю, скріншот чи PDF — через Telegram, вебпанель або API — файл не проходить через центральну інфраструктуру mintbot дорогою до мовної моделі. Він приземляється просто на VPS вашого власного агента, залишається там стільки, скільки ви захочете, а LLM отримує перетворену копію, оптимізовану саме під нього.

Це тихе проєктне рішення з гучними наслідками. Варто його розгорнути, бо це одне з місць, де mintbot найсильніше розходиться зі споживчим LLM-чатом.

Потік від початку до кінця

  1. Завантаження приходить на VPS агента. Фотографія з Telegram, PDF, перетягнутий у вебпанель, голосова нотатка, скріншот, вставлений у чат. Локальний API агента приймає байти, нюхає магічний заголовок, щоб зрозуміти, що це насправді за файл (телефони і браузери на диво часто маркують файли неправильно), рахує SHA-256 і записує файл у каталог /var/lib/mintbot-agent/uploads/<shard>/<sha256>.<ext> на VPS вашого власного агента. У локальний каталог потрапляє рядок із джерелом (telegram / panel / api), ID завантажувача, MIME-типом і початковим іменем файлу.

  2. Оригінал священний. З цього моменту всередині mintbot ніхто збережений файл більше не змінює. Адаптери, що готують його для LLM, видають лише робочі копії — зменшені JPEG, перекодований текст, витягнуті мініатюри. Байт у байт оригінал залишається на диску, доки ви самі не видалите його через файловий менеджер агента. Немає центрального сховища, немає таймера зберігання, немає витоків між агентами: VPS кожного агента знає лише про завантаження свого власника.

  3. Модель отримує оптимізовану для LLM версію. Коли агент вирішує показати файл LLM, маленький диспетчер за MIME-типом і розширенням обирає потрібний адаптер, і адаптер видає блоки контенту, які модель може прочитати:

    Адаптер Що обробляє Вихід
    Image JPG, PNG, WebP, GIF, HEIC (iPhone), AVIF і все інше, що вміє відкривати Pillow Зменшено до 1568 px по довшому боку, перекодовано в JPEG q85, base64-inline у контексті моделі
    PDF .pdf до 32 MB Base64-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, тож удруге, коли модель потребує того ж файлу, завантаження відбувається миттєво. Підняття версії адаптера автоматично анулює кеш.

  4. У контекст моделі не потрапляють 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 стоять саме на цьому фундаменті.