Хотел порядка в своём веб-интерфейсе к моделям: удалил чат — значит, ушли и фотографии с документами, которые я в него загружал. Так я считал, ни разу этого не проверив.
Споткнулся на простом замере. Чатов в базе ноль, а в хранилище 14 файлов на 64 МБ, накопленных за месяц. Open WebUI при удалении чата стирает сам чат и сообщения, а загруженные файлы оставляет, и настройки на это у него нет — в коде образа такой уборки нет вовсе. То есть всё, что я скидывал в разговор, лежало бы там бессрочно, и узнал бы я об этом только случайно.
Решил проходом раз в час. Он находит файлы, на которые не ссылается ничто живое: ни чат, ни общая ссылка на чат, ни база знаний, ни канал, ни папка, ни заметка, ни модель. Мусор определяют два правила:
- файл удалённого чата уходит сразу, ждать нечего — теперь такой файл живёт не дольше часа;
- файл, ни разу не привязанный к чату, выдерживается сутки: загрузка идёт отдельным запросом до отправки сообщения, и свежий файл без чата — это вложение в ещё не написанном сообщении, а не мусор.
Удаляет при этом не мой скрипт, а сам интерфейс своей ручкой: вместе с файлом он убирает и запись в базе, и извлечённый из документа текст в векторной базе. Правка базы в обход интерфейса оставила бы этот текст лежать — ровно то, от чего я избавлялся. Первый проход снял 8 файлов и 20 МБ, шесть свежих остались ждать свои сутки.
Чем плачу. Ради одной ручки пришлось включить в интерфейсе ключи API, которых у меня до этого не было. Ключ несёт права своей учётной записи, то есть администратора, поэтому он заперт на одну группу ручек — файлы: ни чатов, ни настроек, ни пользователей этим ключом не прочитать. Второе: запрос, которым проход ищет ссылки, перечисляет таблицы конкретной версии образа. Новая версия может завести ссылку в другом месте, и файл оттуда покажется ненужным, — поэтому обновление образа не проходит тест, пока я не перечитаю этот запрос. И третье правило, без которого остальные опасны: проход, не сумевший прочитать базу, не удаляет ничего. «Ссылок не нашлось» и «ссылки не прочитались» выглядят одинаково, а второе вычистило бы хранилище целиком. Из 45 тестов большая часть — про это.
#агенты