Гайд · TNWS AI

Как запустить CodeAgent smolagents в Docker-песочнице

4 мин—

Изолированный executor_type=docker для CodeAgent: установка extra, context manager, тест вычисления, критерии очистки и границы безопасности.

Задача и применимость

Актуальный поисковый запрос: «как безопасно запустить CodeAgent smolagents в Docker». Не исполнять сгенерированный моделью Python-код прямо в основном процессе. Официальное руководство предупреждает, что локальное выполнение CodeAgent рискованно, и показывает executor_type="docker". Для Docker-варианта требуется установленный Docker и extra smolagents[docker]; context manager обеспечивает немедленную очистку контейнера после задачи. Контейнеризация уменьшает поверхность риска, но не является автоматической полной изоляцией при опасных mounts, сети или правах. Материал сверён 26 сентября 2026 года с официальной документацией Hugging Face smolagents. Документация прямо помечает API экспериментальным, поэтому перед производственным использованием закрепите версию пакета и повторите тесты. Примеры рассчитаны на Python 3.10+; доступ к конкретной модели и провайдеру проверяется в вашем аккаунте, а не предполагается этой инструкцией.

Пошаговая настройка

  1. Подготовьте отдельную тестовую машину с Docker и установите документированный extra.
  2. Не передавайте контейнеру секреты, сокет Docker и каталоги хоста без необходимости.
  3. Создайте CodeAgent внутри with с executor_type="docker".
  4. Запустите безопасную арифметическую задачу, проверьте ответ и факт очистки; затем отдельно ревизуйте сетевые и файловые разрешения.

До сетевого запуска установите smolagents, настройте HF_TOKEN или другой документированный способ аутентификации и вынесите идентификатор модели в HF_MODEL_ID. Не вставляйте действующий токен в код, prompt, скриншот или статью. Сначала выполните детерминированную часть примера без модели, затем интеграционный run. Так ошибка схемы или бизнес-логики не смешивается с изменчивым поведением LLM.

Готовый шаблон

import os
from smolagents import CodeAgent, InferenceClientModel

model = InferenceClientModel(model_id=os.environ.get("HF_MODEL_ID", "Qwen/Qwen3-Next-80B-A3B-Thinking"), token=os.getenv("HF_TOKEN"))
with CodeAgent(model=model, tools=[], executor_type="docker", max_steps=3) as agent:
    answer = agent.run("Вычисли сумму целых чисел 2, 3 и 5. Верни число.")
    print(answer)

Конкретный вход и ожидаемые данные

Вход — вычисление 2 + 3 + 5, ожидаемое числовое содержание результата — 10. Это тест жизненного цикла executor, а не тест доступа к файлам. Отрицательная проверка должна подтвердить, что контейнер не получает чувствительные каталоги и привилегии, которых нет в конфигурации. Нельзя заявлять безопасность только потому, что ответ равен 10.

Почему схема работает

Сгенерированный код недоверен по происхождению, даже если пользовательский запрос выглядит доб benign. Context manager вызывает очистку ресурсов, но аварии хоста и неверная конфигурация инфраструктуры требуют внешнего контроля. Docker не защищает от утечки через разрешённую сеть или смонтированные секреты. В продуктивном контуре задайте ограничения CPU, памяти, времени, сети и файловой системы средствами вашей платформы и проверяйте их независимыми тестами.

Фактическая проверка и пограничный случай

Перед реальными данными выполните тесты запрета: чтение неразрешённого пути, обращение к локальному metadata endpoint и превышение времени. Результат должен фиксировать отказ, а не содержимое ресурса. Не публикуйте конкретный обход ограничений. Обновляйте базовый образ и зависимости, задавайте доверенный image policy и уничтожайте окружение после каждого недоверенного запуска. Если организация не умеет сопровождать такой sandbox, выбирайте ToolCallingAgent с узкими инструментами.

Протокол воспроизводимости

Для каждого прогона запишите четыре независимых артефакта: точный обезличенный вход, ожидаемое действие, фактическое действие и предметно правильный результат. Не ограничивайтесь снимком финального ответа: он не показывает, был ли вызван нужный инструмент. Повторите опыт не менее трёх раз на одной модели с одинаковыми настройками, затем отдельно после смены версии. В отчёте различайте ошибку маршрутизации, неверный аргумент, сбой Python-кода и неподтверждённую генерацию. Если результат нестабилен, не выбирайте удачный прогон вручную: укажите долю успеха на фиксированном наборе. Настройки температуры и провайдера фиксируйте только если они действительно переданы вашему model-клиенту. Такой протокол позволяет повторить вывод и не превращает единичный удачный ответ в обещание качества.

Синтаксис Python проверяется до публикации через ast.parse. Выполнение с реальной моделью здесь не заявляется: без учётных данных нельзя честно подтвердить доступность конкретного inference provider и поведение модели. Проверяемая часть примера выполняется локально там, где она не требует LLM. Для сетевой части заранее запишите модель, версию smolagents, вход, ожидаемый tool call и предметный эталон, затем сохраните обезличенную трассу.

Критерии приёмки

  1. Арифметический сценарий возвращает 10 на тестовой модели и конфигурации.
  2. После выхода из with временный executor очищен штатным механизмом.
  3. Контейнер не получает лишние mounts, привилегированный режим и секреты приложения.

Успешное завершение Python-процесса не равно правильному ответу агента. Сверяйте три слоя отдельно: корректность аргументов tool, фактическое наблюдение из доверенного кода и соответствие финальной фразы этому наблюдению. Если хотя бы один слой не прошёл, результат не должен автоматически попадать в CRM, базу знаний или действие с побочным эффектом.

Типичные ошибки и чего не делать

  • Не используйте локальный executor для недоверенного кода по умолчанию.
  • Не монтируйте Docker socket внутрь песочницы.
  • Не называйте контейнер абсолютной границей безопасности без анализа конфигурации.

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

FAQ

Зачем with?

Документация рекомендует context manager для немедленной очистки контейнера.

Что установить?

Docker и пакет с extra smolagents[docker].

Можно ли дать контейнеру сеть?

Только по явной необходимости и с ограничениями; это отдельное решение безопасности.

Официальные источники

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

Зачем with?

Документация рекомендует context manager для немедленной очистки контейнера.

Что установить?

Docker и пакет с extra `smolagents[docker]`.

Можно ли дать контейнеру сеть?

Только по явной необходимости и с ограничениями; это отдельное решение безопасности.

Читайте также

Комментарии

Пока тихо. Скажите первое слово