mintbot がファイルをどう扱うか¶
mintbot agent に写真、文書、音声メモ、スプレッドシート、スクリーンショット、PDF を送ると — Telegram、Web パネル、API のいずれ経由でも — そのファイルは言語モデルに渡る途中で mintbot の中央インフラを通りません。直接 あなた自身の agent VPS に着地し、あなたが望む限りそこにとどまり、LLM はそこから最適化されたコピーを受け取ります。
これは静かな設計判断ですが、結果は大きく響きます。mintbot が一般向けの LLM チャットと最も大きく分かれる場所のひとつなので、丁寧に解きほぐす価値があります。
エンドツーエンドの流れ¶
-
アップロードは agent VPS に到着する。 Telegram からの写真、Web パネルにドラッグされた PDF、音声メモ、チャットに貼り付けたスクリーンショット。agent のローカル API がバイト列を受け取り、マジックバイトを嗅いで実際にどの種類のファイルかを判定し(電話やブラウザは驚くほど頻繁にラベルを誤ります)、SHA-256 でハッシュし、agent 自身の VPS の
/var/lib/mintbot-agent/uploads/<shard>/<sha256>.<ext>に書き込みます。ローカルのカタログには、ソース(telegram / panel / api)、アップローダー ID、MIME タイプ、元のファイル名を含む行が追加されます。 -
オリジナルは神聖。 この時点から、mintbot の内部では保存されたファイルが書き換えられることは一切ありません。LLM 向けに準備するアダプターが出すのは 作業コピー だけ — リサイズされた JPEG、テキスト化された内容、抽出されたサムネイル。バイト単位のオリジナルは、agent のファイルマネージャーから自分で削除するまでディスク上に残ります。中央のバケットも、保持期限のタイマーも、agent 同士の漏洩もありません。各 agent の VPS は自分のオーナーのアップロードしか知りません。
-
モデルは LLM 用に最適化されたバージョンを受け取る。 agent がファイルを LLM に見せると決めると、小さなディスパッチャーが MIME タイプと拡張子から正しい アダプター を選び、アダプターはモデルが読めるコンテンツブロックを出力します:
アダプター 対応 出力 Image JPG, PNG, WebP, GIF, HEIC(iPhone), AVIF、その他 Pillow が開けるもの全部 長辺 1568 px にリサイズ、JPEG q85 で再エンコード、モデルコンテキストに base64 インライン PDF .pdf32 MB 以下ネイティブ PDF として base64 インライン(Anthropic 系モデルはそのまま読みます) Text .md,.csv,.json,.yaml、ソースコード(.py,.js,.ts,.go,.rs, …)、ログ、diffUTF-8 でデコード(latin-1 フォールバック)、サイズ上限まで本文をインライン Audio .mp3,.ogg,.opus,.m4a,.wav,.flacTelegram の音声メモは bot がすでにインラインで文字起こし済み。直接アップロードは今のところプレースホルダー、Whisper STT が次のウェーブで入ります Video .mp4,.mov,.webm,.mkv今のところプレースホルダー。ffmpeg のキーフレーム抽出と音声文字起こしは次のウェーブで入ります Office docs .docx,.xlsx,.pptx,.odt,.ods,.odp今のところプレースホルダー。ネイティブのテキスト抽出(python-docx / openpyxl / python-pptx)は次のウェーブで入ります Unknown それ以外すべて テキストのプレースホルダー:「ユーザーが <mime>ファイルを添付しました、アップロード ID<id>でディスクに保存されています」 — モデルが少なくとも「何が送られてきたか」について推論できるように変換結果はオリジナルの隣に
<sha256>.cache/v<N>.jsonとしてキャッシュされ、二度目以降は即時ロードになります。アダプターのバージョンを上げるとキャッシュは自動的に無効化されます。 -
モデルコンテキストに有効期限付き URL は入らない。 画像や PDF が LLM に渡るときは同じターンで base64 インライン化されます — 後で 404 になり得る URL も、タイマー付きの署名リンクもありません。モデルがポインタだけを必要とする大きなファイルの場合は、内部 URL
https://agent<id>.<domain>/<panel_token>/api/local/uploads/<upload_id>/rawを使います — あなた自身の agent のパネルトークンで保護され、ファイルがディスク上にある限り有効です。
なぜこれが一般向け LLM チャット体験より優れているのか¶
ChatGPT に写真をアップロードしたり Claude.ai に PDF を投げたりすると、ファイルは プロバイダー側の ストレージに入り、その会話に紐づけられ、いつ消えるかはプロバイダーの保持ポリシーが決めます。一定の時間が経つとファイルは消えていて、それを含んでいた会話自体はまだ見えていてもです。プロバイダーを乗り換えるということは、最初からやり直すということです。
よくある Telegram bot の罠が、この対比をはっきりさせてくれます。Telegram 自体はすべての写真に永続的な file_id を持っていますが、Telegram の file_id を取りに行くサードパーティ bot は、24 時間で失効する一時 URL しか受け取れません。 昨日の写真を参照する古い bot は 404 を返します。mintbot はこれを一度きりで解決します — Telegram のファイルを初めて見たときに、永続的に有効な file_id を通じてバイト列を取得し直し、あなたの agent アーカイブにコピーするのです。その瞬間から、その写真はあなたのものです。
この設計から三つのことが導かれます:
- ファイルはあなたに属し、LLM プロバイダーに属さない。 来月 Claude から GPT-5 に乗り換えても、ファイル履歴は無傷でついてきます — それはベンダーのバケットではなく、あなたの VPS にあるからです。
- あとから聞き直せる。 「3 か月前に契約書を分析してくれたよね — それをこの新しいドラフトと比べられる?」 が成立します。オリジナルがディスク上に残っているからです。一般向けチャットでは、古いファイルはたいてい消えています。
- モデルは常に、自分が最もよく扱えるバージョンを受け取る。 ビジョンモデルはリサイズされた JPEG、テキストリーダーは UTF-8、PDF リーダーはネイティブ PDF。電話から HEIC をアップロードしてもそのまま動きます — Pillow の HEIF プラグインが起動時にロードされ、
application/octet-streamと誤って申告してくる電話はマジックバイトの嗅ぎ手が捕まえます。
ファイルを管理する場所¶
agent の Web パネルのトップバーには ファイルマネージャー があります。agent VPS 全体をブラウズでき、アップロードアーカイブ /var/lib/mintbot-agent/uploads/ が会話で埋まっていく場所です。そこから次のことができます:
- アップロード済みファイルの名前変更、削除、移動
- 日付・ソース・ファイル名でのブラウズ
- 新規アップロードのドラッグ&ドロップ(チャンク対応、数 GB のファイルもサポート)
- 小さなテキストファイルのインライン編集
パネルからファイルを削除すると、ブロブもカタログ行も一緒に消えます。agent はそれを LLM に見せることができなくなります。これ こそが、オリジナルを「あなたのもの」たらしめている点です — 削除権限を持つのはあなただけ。
結論¶
たいていの LLM チャット製品は、あなたのアップロードを一時的な会話コンテキストとして扱います。mintbot はそれを あなたのデータ として扱います — あなたの VPS に保存され、あなたが所有し、そのターンにモデルが最もよく扱える形に必要に応じて変換されます。mintbot のより興味深い能力の多くは、この土台の上に乗っています。