Файловый доступ обычно настраивают в обратном порядке: включают всё, убеждаются, что работает, и собираются ограничить потом. «Потом» наступает после первого неприятного случая.
Порядок ниже противоположный: одна папка на чтение, проверка границы, потом запись, потом вторая папка. Он медленнее на один вечер и снимает весь класс проблем, ради которых пишут статьи с заголовком «ИИ удалил мои файлы». Зачем вообще давать ассистенту диск и какие сценарии это открывает — в обзорном материале про ИИ, который создаёт файлы.
#Что понадобится
- Ассистент с файловыми инструментами и возможностью включать их по одному.
- Пустая или почти пустая папка под первые эксперименты. Не домашний каталог и не папка с рабочими документами.
- Возможность увидеть список вызовов с аргументами. Без неё третий шаг проверить нельзя.
- Бэкап того, что вы в итоге отдадите под запись. Не «есть где-то», а такой, из которого вы восстанавливались.
#Шаг 1. Понять, как устроена граница
Прежде чем настраивать, полезно знать, что именно проверяется. Механизмов ограничения два, и они не заменяют друг друга.
Рабочая папка. Все относительные пути разрешаются внутри одного каталога. Путь, который после нормализации оказывается вне его, отклоняется. Ключевое слово — «после нормализации»: сравнение сырых строк обходится переходом на уровень вверх и символическими ссылками. В Persona путь приводится к каноническому виду и сверяется с корнем рабочей папки, а при выходе за него возвращается ошибка вида «path escapes workspace».
Жёсткий запрет системных каталогов. Отдельный список путей, куда запись невозможна независимо от настроек: системные каталоги Windows и корневые системные пути в Unix-подобных системах. Этот список не отключается конфигурацией — он существует на случай, если первый механизм настроен неправильно.
Два механизма нужны потому, что первый — про вашу конфигурацию, а второй — про то, что даже неправильная конфигурация не должна дать записать в системную папку.
#Шаг 2. Включить один читающий инструмент
Начинайте с инструмента, который перечисляет содержимое каталога. Не с чтения файла — именно со списка: он безопаснее и сразу показывает, правильно ли выбран корень.
- Включите инструмент списка каталога, остальные оставьте выключенными.
- Укажите рабочую папку. Одну.
- Задайте запрос вида «покажи, что лежит в рабочей папке».
- Сверьте вывод с тем, что вы видите в файловом менеджере.
Признак правильной настройки: список совпадает и не содержит ничего постороннего. Если вы видите содержимое домашнего каталога — корень выбран неправильно, и дальше идти нельзя.
Полезная деталь реализации: список обычно обрезается, иначе одна папка с тысячей файлов вытеснит из контекста саму задачу. В Persona выводится до 200 записей с явной пометкой, сколько осталось.
#Шаг 3. Включить чтение файла и ограничить размер
Второй инструмент — чтение содержимого. Здесь появляется новый риск: не потеря данных, а расход контекста.
Файл на несколько мегабайт, попавший в контекст, вытесняет постановку задачи и всё, что было до него. Поэтому у чтения обязан быть предел размера. В нашей реализации файлы больше 500 КБ не открываются вовсе — возвращается ошибка с указанием размера, из которой модель понимает, что надо искать другой путь.
Проверьте это у себя: положите в рабочую папку заведомо большой файл и попросите его прочитать. Ожидаемый результат — понятный отказ, а не многоминутное молчание и не обрыв ответа.
#Шаг 4. Тест на выход за границы
Это главный шаг руководства. Без него у вас нет белого списка, у вас есть настройка, которая, возможно, работает.
Выполните четыре пробы подряд, каждую отдельным запросом, и запишите результат.
Проба 1 «прочитай файл ../secret.txt»
Ожидание: отказ с сообщением о выходе за границу
Провал: содержимое файла
Проба 2 «прочитай файл C:\Windows\win.ini»
(в Unix-подобной системе — /etc/passwd)
Ожидание: отказ
Провал: содержимое файла
Проба 3 «покажи содержимое папки ../..»
Ожидание: отказ
Провал: список каталогов выше рабочей папки
Проба 4 «прочитай ./sub/../../outside.txt»
Ожидание: отказ
Провал: содержимое файла
Четвёртая проба отличается от первой тем, что путь выглядит внутренним и становится внешним только после нормализации. Именно на ней ломаются реализации, сравнивающие строки без приведения к каноническому виду. Если первые три прошли, а четвёртая нет — граница у вас декоративная.
Отдельно проверьте, что видно в логе: должны быть зафиксированы четыре вызова с четырьмя отказами. Если вызовов в логе нет вовсе, значит модель до инструмента не дошла и вы проверили не то — переформулируйте запрос прямее.
#Шаг 5. Добавить запись
К записи переходите только после четырёх успешных отказов.
- Включите инструмент создания файла. Инструмент удаления пока не трогайте.
- Повторите пробы 1 и 2 в варианте на запись: попросите записать файл наружу и в системный каталог. Ожидание — два отказа.
- Создайте обычный файл внутри рабочей папки и убедитесь, что он появился там, где вы ожидаете.
- Проверьте перезапись: попросите записать файл с существующим именем и посмотрите, спрашивает ли система подтверждение. Если нет — считайте, что перезапись возможна всегда, и держите бэкап.
Удаление оставьте на конец или не включайте вовсе. Если включаете — убедитесь, что оно отказывает на корне рабочей папки и на путях с переходом на уровень вверх; в нашей реализации такие пути отклоняются до всякого обращения к диску.
#Проверка результата
Настройка считается завершённой, когда одновременно выполняются пять условий:
- список каталога показывает ровно вашу рабочую папку;
- четыре пробы на выход за границу дают четыре отказа;
- запись наружу и в системный каталог отклоняется;
- большой файл не читается, а отклоняется с понятным сообщением;
- все вызовы, включая отказы, видны в журнале с аргументами.
Пятое условие важнее, чем кажется. Отказ, которого не видно в логе, неотличим от того, что инструмент вообще не вызывался, — а это разные ситуации.
#Что может пойти не так
Символические ссылки. Ссылка внутри рабочей папки, указывающая наружу, обходит проверку по строке. Единственное лечение — приводить путь к каноническому виду с разрешением ссылок и только потом сравнивать с корнем.
Агент работает не там, где вы думаете. Если у ассистента есть режим работы с файлами на другом устройстве, инструменты могут уходить туда, а не в локальную папку. В Persona при включённом режиме удалённой файловой системы файловые операции уходят на устройство владельца, и это отдельная настройка, которую легко забыть.
Инструмент удаления включили заодно. Он включается отдельно, после всего остального, и лучше не включается вовсе. То же касается выполнения команд: терминал обходит любые файловые ограничения, потому что у него нет проверяемых параметров — аргументы разобраны в статье о том, почему нельзя просто дать агенту терминал.
Модель не находит файл, который есть. Обычно дело в том, что она передаёт путь с лишним префиксом рабочей папки. Проверяется по логу: в аргументах видно, какой именно путь ушёл в инструмент.
#Когда файловый доступ не нужен
Если ассистент нужен вам для текстов и объяснений — не включайте файловые инструменты вовсе. Копирование ответа в редактор занимает две секунды и не создаёт ни одного из перечисленных рисков.
Если нужно разово обработать десяток файлов — сделайте это скриптом. Скрипт быстрее, дешевле и делает ровно то, что написано. Агент оправдан там, где решение о том, какой файл трогать, нельзя принять заранее.
И отдельно: если задача сводится к «найди в моих документах» — это чтение, а не запись. Разбор сценариев работы с документами на диске — в материале про ИИ и документы на диске. Общая рамка прав по классам инструментов — в руководстве по белым спискам и правам по умолчанию.
#Частые вопросы
#Можно ли дать агенту доступ ко всему диску?
Технически да, практически это означает отсутствие ограничений. В домашнем каталоге лежат ключи, конфигурации и переписка, а модель не отличает их от рабочих файлов по названию. Если нужен обзор большого объёма — делайте отдельный читающий инструмент с индексом, а не выдачу полного доступа.
#Как проверить, что агент не выйдет за границу?
Четырьмя пробами из шага 4: путь с переходом на уровень вверх, абсолютный системный путь, список каталога выше рабочего и путь, который становится внешним только после нормализации. Последняя проба — ключевая: на ней ломаются реализации, сравнивающие строки без приведения к каноническому виду.
#Где физически лежат файлы, с которыми работает агент?
Зависит от конфигурации, и это стоит выяснить до первой записи. В Persona по умолчанию это папка на той машине, где развёрнуто приложение; при включённом режиме работы с устройством владельца файловые операции уходят туда. Разные режимы — разные места, и путать их дорого.
#Нужно ли подтверждение на каждую запись?
На первое время — да, пока вы не увидите по логам, что модель обращается ровно туда, куда вы ожидаете. Дальше подтверждение разумно оставить на перезапись существующих файлов и на удаление, а обычное создание нового файла в рабочей папке пропускать.
#Что делать, если агент перезаписал нужный файл?
Восстанавливать из бэкапа: у файловых инструментов, как правило, нет корзины и нет истории версий. Отсюда практическое правило — рабочая папка агента не должна быть единственным местом, где живут ваши данные.
#Влияет ли файловый доступ на приватность?
Прямо: всё, что агент прочитал, попадает в контекст, а контекст уходит туда, где работает модель. При локальной модели он остаётся на вашей машине, при облачном ключе — уходит провайдеру этой модели. Подробный разбор конфигураций — в материале про приватный ИИ локально.
#Вывод
Порядок настройки: одна папка, список каталога, чтение с ограничением размера, четыре пробы на выход за границу, и только потом запись. Удаление — в самом конце или никогда.
Если четыре пробы дали четыре отказа и все они видны в журнале — у вас есть белый список. Если хотя бы одна проба вернула содержимое, у вас его нет, независимо от того, что написано в настройках.