Comment mintbot gère les fichiers¶
Quand tu envoies une photo, un document, une note vocale, un tableur, une capture d'écran ou un PDF à ton agent mintbot — via Telegram, le panneau web ou l'API — le fichier ne passe pas par l'infrastructure centrale de mintbot avant d'atteindre le modèle de langage. Il atterrit directement sur le VPS de ton propre agent, y reste aussi longtemps que tu le veux, et le LLM en reçoit une copie transformée et optimisée pour lui.
C'est une décision de conception discrète aux conséquences bruyantes. Ça vaut la peine de l'expliquer, parce que c'est l'un des plus grands écarts entre mintbot et le chat LLM grand public.
Le flux, de bout en bout¶
-
Le téléversement arrive sur le VPS de l'agent. Une photo depuis Telegram, un PDF glissé dans le panneau web, un mémo vocal, une capture collée dans le chat. L'API locale de l'agent accepte les octets, renifle l'en-tête magique pour comprendre quel type de fichier c'est réellement (les téléphones et les navigateurs étiquettent mal de façon étonnamment fréquente), calcule son hash SHA-256, et l'écrit dans
/var/lib/mintbot-agent/uploads/<shard>/<sha256>.<ext>sur le VPS de ton propre agent. Une ligne s'ajoute à un catalogue local avec la source (telegram / panel / api), l'ID du téléverseur, le type MIME et le nom de fichier d'origine. -
L'original est sacré. À partir de là, plus rien dans mintbot ne modifie le fichier stocké. Les adaptateurs qui le préparent pour le LLM n'émettent que des copies de travail — JPEG redimensionnés, texte transcodé, vignettes extraites. L'original, octet pour octet, reste sur le disque jusqu'à ce que tu le supprimes via le gestionnaire de fichiers de l'agent. Pas de bucket central, pas de minuteur de rétention, pas de fuite entre agents : le VPS de chaque agent ne connaît que les téléversements de son propre propriétaire.
-
Le modèle reçoit une version optimisée pour LLM. Quand l'agent décide de montrer le fichier au LLM, un petit dispatcher choisit le bon adaptateur selon le type MIME et l'extension, et l'adaptateur émet des blocs de contenu que le modèle peut lire :
Adaptateur Gère Sortie Image JPG, PNG, WebP, GIF, HEIC (iPhone), AVIF, et tout ce que Pillow sait ouvrir Redimensionné à 1568 px sur le côté long, ré-encodé en JPEG q85, inliné en base64 dans le contexte du modèle PDF .pdf≤ 32 MBInliné en base64 comme PDF natif (les modèles Anthropic le lisent directement) Text .md,.csv,.json,.yaml, code source (.py,.js,.ts,.go,.rs, …), logs, diffsDécodé en UTF-8 (latin-1 en repli), inliné en texte jusqu'à une limite de taille Audio .mp3,.ogg,.opus,.m4a,.wav,.flacLes notes vocales Telegram sont déjà transcrites inline par le bot ; les téléversements directs reçoivent pour l'instant un marqueur, Whisper STT arrivera dans une vague suivante Video .mp4,.mov,.webm,.mkvMarqueur pour l'instant ; extraction keyframe via ffmpeg + transcription audio arrivent dans une vague suivante Office docs .docx,.xlsx,.pptx,.odt,.ods,.odpMarqueur pour l'instant ; l'extraction de texte native (python-docx / openpyxl / python-pptx) arrive dans une vague suivante Unknown Tout le reste Marqueur texte : « l'utilisateur a joint un fichier <mime>, il est conservé sur disque avec l'ID de téléversement<id>» — pour que le modèle puisse au moins raisonner sur ce qui a été envoyéChaque transformation est mise en cache à côté de l'original sous
<sha256>.cache/v<N>.json, si bien qu'à la deuxième fois où le modèle a besoin de ce fichier, le chargement est instantané. Incrémenter la version de l'adaptateur invalide automatiquement le cache. -
Pas d'URL expirante dans le contexte du modèle. Quand une image ou un PDF part vers le LLM, c'est inliné en base64 dans le même tour — pas d'URL qui pourrait renvoyer un 404 plus tard, pas de lien signé à minuteur. Pour les fichiers plus gros où le modèle n'a besoin que d'un pointeur, l'URL est interne :
https://agent<id>.<domain>/<panel_token>/api/local/uploads/<upload_id>/raw— protégée par le panel token de ton propre agent, valide tant que le fichier vit sur disque.
Pourquoi ça bat le chat LLM grand public¶
Quand tu téléverses une photo dans ChatGPT ou un PDF dans Claude.ai, le fichier part dans le stockage du fournisseur, rattaché à cette conversation, et la politique de rétention du fournisseur décide quand il disparaît. Passé un certain âge, le fichier est parti, même si tu vois encore la conversation où il vivait. Changer de fournisseur veut dire repartir de zéro.
Un piège classique des bots Telegram rend le contraste très concret. Telegram lui-même conserve un file_id permanent pour chaque photo, mais les bots tiers qui récupèrent un file_id Telegram obtiennent une URL temporaire qui expire au bout de 24 heures. Les vieux bots qui référencent la photo d'hier servent un 404. mintbot règle ça une fois pour toutes : la première fois qu'il voit un fichier Telegram, il re-télécharge les octets via le file_id éternellement valide et les copie dans l'archive de ton agent. À partir de ce moment, la photo est à toi.
Trois conséquences découlent de cette conception :
- Les fichiers t'appartiennent, pas au fournisseur de LLM. Tu passes de Claude à GPT-5 le mois prochain et ton historique de fichiers part avec toi, intact, parce qu'il vit sur ton VPS — pas dans le bucket d'un fournisseur.
- Tu peux re-demander plus tard. « Il y a trois mois tu m'as analysé un contrat — peux-tu le comparer à ce nouveau brouillon ? » fonctionne, parce que l'original est toujours sur disque. Dans le chat grand public, le fichier plus ancien a généralement disparu.
- Le modèle reçoit toujours la version qu'il sait le mieux exploiter. Les modèles vision reçoivent le JPEG redimensionné, les lecteurs de texte reçoivent de l'UTF-8, les lecteurs de PDF reçoivent du PDF natif. Les téléphones peuvent téléverser du HEIC et ça marche tout simplement — le plugin HEIF de Pillow se charge au démarrage, et le renifleur d'octets magiques rattrape les téléphones qui étiquettent le fichier
application/octet-stream.
Où gérer tes fichiers¶
Le panneau web de l'agent embarque un gestionnaire de fichiers dans la barre du haut. Il parcourt tout le VPS de l'agent, et l'archive des téléversements dans /var/lib/mintbot-agent/uploads/ est la partie que tes conversations remplissent. De là tu peux :
- Renommer, supprimer ou déplacer les fichiers téléversés
- Les parcourir par date, source ou nom de fichier
- Déposer de nouveaux téléversements en glisser-déposer (chunked, supporte des fichiers de plusieurs gigaoctets)
- Éditer de petits fichiers texte inline
Supprimer un fichier depuis le panneau retire à la fois le blob et la ligne du catalogue. L'agent ne pourra plus le présenter au LLM. C'est ce qui rend l'original « le tien » : tu es le seul à avoir l'autorité de suppression.
Conclusion¶
La plupart des produits de chat LLM traitent tes téléversements comme du contexte de conversation éphémère. mintbot les traite comme tes données — stockées sur ton VPS, t'appartenant, converties à la demande dans la forme dont le modèle a besoin ce tour-ci. Une bonne partie des capacités les plus intéressantes de mintbot reposent sur cette fondation.