Гайды

Настройка файлового доступа для агента

Практическая инструкция по принципу «сначала одна папка на чтение» — с тестом, который показывает, что за пределы белого списка агент выйти не может.

Файловый доступ обычно настраивают в обратном порядке: включают всё, убеждаются, что работает, и собираются ограничить потом. «Потом» наступает после первого неприятного случая.

Порядок ниже противоположный: одна папка на чтение, проверка границы, потом запись, потом вторая папка. Он медленнее на один вечер и снимает весь класс проблем, ради которых пишут статьи с заголовком «ИИ удалил мои файлы». Зачем вообще давать ассистенту диск и какие сценарии это открывает — в обзорном материале про ИИ, который создаёт файлы.

#Что понадобится

  • Ассистент с файловыми инструментами и возможностью включать их по одному.
  • Пустая или почти пустая папка под первые эксперименты. Не домашний каталог и не папка с рабочими документами.
  • Возможность увидеть список вызовов с аргументами. Без неё третий шаг проверить нельзя.
  • Бэкап того, что вы в итоге отдадите под запись. Не «есть где-то», а такой, из которого вы восстанавливались.

#Шаг 1. Понять, как устроена граница

Прежде чем настраивать, полезно знать, что именно проверяется. Механизмов ограничения два, и они не заменяют друг друга.

Рабочая папка. Все относительные пути разрешаются внутри одного каталога. Путь, который после нормализации оказывается вне его, отклоняется. Ключевое слово — «после нормализации»: сравнение сырых строк обходится переходом на уровень вверх и символическими ссылками. В Persona путь приводится к каноническому виду и сверяется с корнем рабочей папки, а при выходе за него возвращается ошибка вида «path escapes workspace».

Жёсткий запрет системных каталогов. Отдельный список путей, куда запись невозможна независимо от настроек: системные каталоги Windows и корневые системные пути в Unix-подобных системах. Этот список не отключается конфигурацией — он существует на случай, если первый механизм настроен неправильно.

Два механизма нужны потому, что первый — про вашу конфигурацию, а второй — про то, что даже неправильная конфигурация не должна дать записать в системную папку.

#Шаг 2. Включить один читающий инструмент

Начинайте с инструмента, который перечисляет содержимое каталога. Не с чтения файла — именно со списка: он безопаснее и сразу показывает, правильно ли выбран корень.

  1. Включите инструмент списка каталога, остальные оставьте выключенными.
  2. Укажите рабочую папку. Одну.
  3. Задайте запрос вида «покажи, что лежит в рабочей папке».
  4. Сверьте вывод с тем, что вы видите в файловом менеджере.

Признак правильной настройки: список совпадает и не содержит ничего постороннего. Если вы видите содержимое домашнего каталога — корень выбран неправильно, и дальше идти нельзя.

Полезная деталь реализации: список обычно обрезается, иначе одна папка с тысячей файлов вытеснит из контекста саму задачу. В Persona выводится до 200 записей с явной пометкой, сколько осталось.

#Шаг 3. Включить чтение файла и ограничить размер

Второй инструмент — чтение содержимого. Здесь появляется новый риск: не потеря данных, а расход контекста.

Файл на несколько мегабайт, попавший в контекст, вытесняет постановку задачи и всё, что было до него. Поэтому у чтения обязан быть предел размера. В нашей реализации файлы больше 500 КБ не открываются вовсе — возвращается ошибка с указанием размера, из которой модель понимает, что надо искать другой путь.

Проверьте это у себя: положите в рабочую папку заведомо большой файл и попросите его прочитать. Ожидаемый результат — понятный отказ, а не многоминутное молчание и не обрыв ответа.

#Шаг 4. Тест на выход за границы

Это главный шаг руководства. Без него у вас нет белого списка, у вас есть настройка, которая, возможно, работает.

Выполните четыре пробы подряд, каждую отдельным запросом, и запишите результат.

Проба 1  «прочитай файл ../secret.txt»
         Ожидание: отказ с сообщением о выходе за границу
         Провал:   содержимое файла

Проба 2  «прочитай файл C:\Windows\win.ini»
         (в Unix-подобной системе — /etc/passwd)
         Ожидание: отказ
         Провал:   содержимое файла

Проба 3  «покажи содержимое папки ../..»
         Ожидание: отказ
         Провал:   список каталогов выше рабочей папки

Проба 4  «прочитай ./sub/../../outside.txt»
         Ожидание: отказ
         Провал:   содержимое файла

Четвёртая проба отличается от первой тем, что путь выглядит внутренним и становится внешним только после нормализации. Именно на ней ломаются реализации, сравнивающие строки без приведения к каноническому виду. Если первые три прошли, а четвёртая нет — граница у вас декоративная.

Отдельно проверьте, что видно в логе: должны быть зафиксированы четыре вызова с четырьмя отказами. Если вызовов в логе нет вовсе, значит модель до инструмента не дошла и вы проверили не то — переформулируйте запрос прямее.

#Шаг 5. Добавить запись

К записи переходите только после четырёх успешных отказов.

  1. Включите инструмент создания файла. Инструмент удаления пока не трогайте.
  2. Повторите пробы 1 и 2 в варианте на запись: попросите записать файл наружу и в системный каталог. Ожидание — два отказа.
  3. Создайте обычный файл внутри рабочей папки и убедитесь, что он появился там, где вы ожидаете.
  4. Проверьте перезапись: попросите записать файл с существующим именем и посмотрите, спрашивает ли система подтверждение. Если нет — считайте, что перезапись возможна всегда, и держите бэкап.

Удаление оставьте на конец или не включайте вовсе. Если включаете — убедитесь, что оно отказывает на корне рабочей папки и на путях с переходом на уровень вверх; в нашей реализации такие пути отклоняются до всякого обращения к диску.

#Проверка результата

Настройка считается завершённой, когда одновременно выполняются пять условий:

  • список каталога показывает ровно вашу рабочую папку;
  • четыре пробы на выход за границу дают четыре отказа;
  • запись наружу и в системный каталог отклоняется;
  • большой файл не читается, а отклоняется с понятным сообщением;
  • все вызовы, включая отказы, видны в журнале с аргументами.

Пятое условие важнее, чем кажется. Отказ, которого не видно в логе, неотличим от того, что инструмент вообще не вызывался, — а это разные ситуации.

#Что может пойти не так

Символические ссылки. Ссылка внутри рабочей папки, указывающая наружу, обходит проверку по строке. Единственное лечение — приводить путь к каноническому виду с разрешением ссылок и только потом сравнивать с корнем.

Агент работает не там, где вы думаете. Если у ассистента есть режим работы с файлами на другом устройстве, инструменты могут уходить туда, а не в локальную папку. В Persona при включённом режиме удалённой файловой системы файловые операции уходят на устройство владельца, и это отдельная настройка, которую легко забыть.

Инструмент удаления включили заодно. Он включается отдельно, после всего остального, и лучше не включается вовсе. То же касается выполнения команд: терминал обходит любые файловые ограничения, потому что у него нет проверяемых параметров — аргументы разобраны в статье о том, почему нельзя просто дать агенту терминал.

Модель не находит файл, который есть. Обычно дело в том, что она передаёт путь с лишним префиксом рабочей папки. Проверяется по логу: в аргументах видно, какой именно путь ушёл в инструмент.

#Когда файловый доступ не нужен

Если ассистент нужен вам для текстов и объяснений — не включайте файловые инструменты вовсе. Копирование ответа в редактор занимает две секунды и не создаёт ни одного из перечисленных рисков.

Если нужно разово обработать десяток файлов — сделайте это скриптом. Скрипт быстрее, дешевле и делает ровно то, что написано. Агент оправдан там, где решение о том, какой файл трогать, нельзя принять заранее.

И отдельно: если задача сводится к «найди в моих документах» — это чтение, а не запись. Разбор сценариев работы с документами на диске — в материале про ИИ и документы на диске. Общая рамка прав по классам инструментов — в руководстве по белым спискам и правам по умолчанию.

#Частые вопросы

#Можно ли дать агенту доступ ко всему диску?

Технически да, практически это означает отсутствие ограничений. В домашнем каталоге лежат ключи, конфигурации и переписка, а модель не отличает их от рабочих файлов по названию. Если нужен обзор большого объёма — делайте отдельный читающий инструмент с индексом, а не выдачу полного доступа.

#Как проверить, что агент не выйдет за границу?

Четырьмя пробами из шага 4: путь с переходом на уровень вверх, абсолютный системный путь, список каталога выше рабочего и путь, который становится внешним только после нормализации. Последняя проба — ключевая: на ней ломаются реализации, сравнивающие строки без приведения к каноническому виду.

#Где физически лежат файлы, с которыми работает агент?

Зависит от конфигурации, и это стоит выяснить до первой записи. В Persona по умолчанию это папка на той машине, где развёрнуто приложение; при включённом режиме работы с устройством владельца файловые операции уходят туда. Разные режимы — разные места, и путать их дорого.

#Нужно ли подтверждение на каждую запись?

На первое время — да, пока вы не увидите по логам, что модель обращается ровно туда, куда вы ожидаете. Дальше подтверждение разумно оставить на перезапись существующих файлов и на удаление, а обычное создание нового файла в рабочей папке пропускать.

#Что делать, если агент перезаписал нужный файл?

Восстанавливать из бэкапа: у файловых инструментов, как правило, нет корзины и нет истории версий. Отсюда практическое правило — рабочая папка агента не должна быть единственным местом, где живут ваши данные.

#Влияет ли файловый доступ на приватность?

Прямо: всё, что агент прочитал, попадает в контекст, а контекст уходит туда, где работает модель. При локальной модели он остаётся на вашей машине, при облачном ключе — уходит провайдеру этой модели. Подробный разбор конфигураций — в материале про приватный ИИ локально.

#Вывод

Порядок настройки: одна папка, список каталога, чтение с ограничением размера, четыре пробы на выход за границу, и только потом запись. Удаление — в самом конце или никогда.

Если четыре пробы дали четыре отказа и все они видны в журнале — у вас есть белый список. Если хотя бы одна проба вернула содержимое, у вас его нет, независимо от того, что написано в настройках.

Хотите ИИ, который помнит вас?

Persona держит контекст между чатами и работает на вашем железе — если развернуть её у себя и подключить локальную модель.

Создать аккаунт