claude CLI, который владеет оболочкой, рабочей директорией и файлами сеансов на диске. Размещение его отличается от размещения stateless API-обертки. Каждый работающий агент — это долгоживущий процесс, привязанный к локальному состоянию, что определяет способ выделения ресурсов, сохранения сеансов и масштабирования между арендаторами.
На этой странице рассматривается самостоятельное размещение на вашей собственной инфраструктуре. Для развертываемых Dockerfile и манифестов Kubernetes см. hosting cookbook.
Если вам не требуется запускать сам цикл агента на вашей собственной инфраструктуре, рассмотрите вместо этого Managed Agents. Anthropic размещает цикл агента, и ваше приложение отправляет события и получает потоковые результаты через клиентские SDK или REST API. Выполнение инструментов происходит в управляемой Anthropic облачной песочнице или в самостоятельно размещаемой песочнице на вашей собственной инфраструктуре.
Модель подпроцесса
Каждое решение о хостинге на этой странице следует из того, как SDK запускает агента. Когда ваш код вызываетquery(), SDK порождает отдельный процесс claude CLI и взаимодействует с ним через stdio. Этот подпроцесс владеет оболочкой, рабочей директорией и транскриптами сеанса JSONL на локальном диске.
cwd в параметрах каждого вызова query() сеанса:
await, поэтому сохраняйте их как файлы .mts или установите "type": "module" в package.json.
Состояние, которое находится на локальном диске
Три вида состояния агента по умолчанию находятся в файловой системе контейнера. Ни одно из них не сохраняется при перезагрузке контейнера, масштабировании вниз или перемещении на другой узел.
Чтобы сохранить транскрипты между хостами, настройте адаптер
SessionStore. Файлы памяти и другие артефакты рабочей директории требуют собственной стратегии хранения, такой как смонтированный том или синхронизация хранилища объектов.
Для информации о том, как сеансы, возобновление и ветвление работают на уровне API, см. Sessions.
Выберите паттерн сеанса
Эти четыре паттерна охватывают жизненный цикл сеанса: как долго контейнер существует относительно обслуживаемых им сеансов. Для информации о том, где запускается контейнер, в кулинарной книге по хостингу есть развертываемый код для локального Docker, Modal и Kubernetes. Выберите паттерн сеанса здесь и цель развертывания из кулинарной книги.Ephemeral sessions
Создайте контейнер для каждой задачи пользователя и уничтожьте его после завершения задачи. Лучше всего подходит для одноразовых задач. Пользователь может по-прежнему взаимодействовать с ИИ во время выполнения задачи, но после завершения контейнер уничтожается. Примеры рабочих нагрузок включают исследование и исправление ошибок, извлечение счетов и квитанций, перевод документов и преобразование медиа. Контейнер запускает одноразовую точку входа, которая читает задачу из переменной окруженияTASK_PROMPT, вызывает SDK и завершает работу.
subtype равен success при завершении задачи в пределах лимита ходов. Если задача достигает лимита в 20 ходов, subtype сообщения результата будет error_max_turns и вызов query() вызовет ошибку после его выдачи, поэтому оберните цикл в блок try, если контейнер должен завершить работу корректно. Смотрите Handle the result для типов ошибок.
Long-running sessions
Запускайте постоянные экземпляры контейнеров, часто размещая несколько процессов SDK на контейнер, для обслуживания текущей работы. Лучше всего подходит для агентов, которые принимают автономные действия, предоставляют контент или обрабатывают высокообъемные потоки сообщений. Примеры рабочих нагрузок включают агента электронной почты, который сортирует и отвечает на входящую почту, конструктор сайтов, который размещает редактируемый пользователем сайт через порты контейнера, и чат-бота, который обрабатывает непрерывный трафик с платформы, такой как Slack. Контейнер предоставляет конечную точку HTTP или WebSocket и сопоставляет каждый активный сеанс с долгоживущим запросом и подпроцессом позади него. Вызовы, которые держат сеансы открытыми и активными, различаются между SDK:- TypeScript: используйте
streamInput()для добавления ходов к активному сеансу. Вызовитеstartup()для предварительного прогрева подпроцессов перед входящим трафиком. Если вы не знаете рабочий каталог сеанса до поступления его первого запроса, предварительно прогрейте с помощьюprewarm()вместо этого. - Python: используйте
ClaudeSDKClientдля сохранения сеанса открытым между ходами.
Hybrid sessions
Ephemeral контейнеры, которые гидратируются изSessionStore при запуске и сохраняют обновления обратно. Лучше всего подходит для сеансов, которые охватывают много взаимодействий, но остаются неактивными между ними. Контейнер выключается в периоды простоя и снова включается, когда пользователь возвращается.
Примеры рабочих нагрузок включают личного менеджера проектов с периодическими проверками, глубокие исследования, которые приостанавливаются и возобновляются в течение часов, и агента поддержки клиентов, который загружает историю билетов между взаимодействиями.
Настройте тайм-аут простоя вашего провайдера в соответствии с тем, как часто вы ожидаете возвращения пользователей. Выключение контейнера без настроенного SessionStore приводит к потере транскрипта вместе с ним, поэтому хранилище требуется для этого паттерна, а не опционально.
Паттерн зависит от возобновления сеанса по ID с подключенным общим хранилищем:
Multi-agent container
Запускайте несколько подпроцессов SDK внутри одного контейнера. Лучше всего подходит для агентов, которые должны тесно сотрудничать, например для многоагентных симуляций, где агенты взаимодействуют друг с другом в общей среде. Дайте каждому агенту свой рабочий каталог, чтобы они не перезаписывали файлы друг друга, и изолируйте загрузку параметров, чтобы файлыCLAUDE.md для каждого агента не просачивались между агентами. Смотрите Изоляция мультитенантности для конкретных опций.
Подготовка контейнера
Контейнеризованная изоляция
Запустите SDK внутри изолированного контейнера для изоляции процессов, ограничения ресурсов, управления сетью и эфемерной файловой системы. Вопросы, которые следует рассмотреть при выборе поставщика:- Кто управляет песочницей: поставщик услуг песочницы управляет инфраструктурой для вас, в то время как самостоятельно размещаемые варианты предоставляют вам программное обеспечение для запуска на собственном сервере.
- Задержка холодного запуска: время от “создания песочницы” до “готовности принять первый запрос”. Эфемерные паттерны требуют запусков менее чем за секунду. Долгоживущие паттерны допускают большую задержку.
- Постоянное хранилище: предоставляет ли поставщик долговечные тома или только эфемерный диск. Гибридный паттерн требует долговечного хранилища где-то, будь то в песочнице или рядом с ней.
- Модель ценообразования: оплата за секунду, за запрос или фиксированная почасовая оплата. Ценообразование за секунду подходит для нестабильных эфемерных рабочих нагрузок. Почасовая оплата подходит для долгоживущих сеансов.
- Сетевые возможности: поддержка пользовательских правил исходящего трафика, исходящих прокси и приватного VPC пиринга для регулируемых сред.
Зависимости среды выполнения
Контейнер требует языковой среды выполнения вашего SDK:- Python 3.10+ для Python SDK или Node.js 18+ для TypeScript SDK
- Оба SDK TypeScript и Python поставляются с нативным бинарным файлом Claude Code для большинства установок, и порожденный CLI не требует отдельной установки Node.js. См. примечание об установке в quickstart для установок, которым требуется отдельная нативная установка Claude Code.
Ресурсы
1 ГиБ ОЗУ, 5 ГиБ диска и 1 CPU на агента — это разумная отправная точка для вновь запущенного экземпляра. Использование памяти растет с длительностью сеанса и активностью инструментов, поэтому выбирайте размер в соответствии с фактическими длительностями сеансов и параллелизмом, которые вам нужны, а не с базовым уровнем простоя. См. Scaling and concurrency для того, как рассчитать количество агентов на хост.Сеть
SDK требует исходящего HTTPS кapi.anthropic.com или к региональной конечной точке вашего поставщика при запуске на Amazon Bedrock или Google Cloud’s Agent Platform. Если ваши агенты используют MCP servers или внешние инструменты, им также требуется исходящий доступ к этим конечным точкам. Для production маршрутизируйте исходящий трафик через прокси выхода, который обеспечивает списки разрешенных доменов, внедряет учетные данные и регистрирует запросы. См. Secure Deployment для полного паттерна.
Для входящего трафика откройте HTTP или WebSocket порт на контейнере. Ваше приложение обрабатывает запросы клиентов на этом порту и вызывает SDK внутренне; сам подпроцесс не прослушивает сеть.
Решение проблем в production
Примите эти решения перед развертыванием самостоятельно размещаемого агента.Сохранение сеанса и состояния
Локальный диск по умолчанию теряется при перезагрузке, масштабировании или перемещении на другой узел. Для любого сеанса, который пользователь ожидает возобновить, зеркалируйте транскрипт в долговечное хранилище с помощью адаптераSessionStore. См. Эталонные реализации для адаптеров хранилища объектов, хранилища ключ-значение и базы данных, а также набор соответствия для вашего собственного.
Три важных момента о том, как ведет себя SessionStore:
- Только транскрипты:
SessionStoreзеркалирует транскрипты, а не файлы памятиCLAUDE.mdили другие артефакты рабочего каталога. Подключите общий том или синхронизируйте их отдельно. - Зеркалирование, а не замена: подпроцесс сначала записывает на локальный диск, а SDK пересылает копию каждого пакета в хранилище. Транскрипт нового сеанса на локальном диске пережидает запуск; сеанс, возобновленный из хранилища, удаляет его локальную копию в конце, поэтому хранилище содержит единственную долговечную копию. См. Архитектура двойной записи.
- Сообщения
mirror_error: когда SDK не может доставить пакет в хранилище, он отбрасывает пакет, выдает сообщение{ type: "system", subtype: "mirror_error" }и продолжает запрос. Установите оповещение на эти события, если долговечность хранилища имеет значение. См. Зеркальные записи — это лучшее усилие для поведения повтора и тайм-аута.
Наблюдаемость
Агенты Agent SDK — это долгоживущие процессы, которые порождают вызовы инструментов во многих раундах API. Без телеметрии вы не сможете увидеть, какие инструменты запустились, сколько времени они заняли или где сеанс застрял. SDK наследует конфигурацию OpenTelemetry из окружения. Установите переменные окружения OTEL на уровне контейнера или оркестратора, чтобы каждый вызовquery() экспортировал spans, метрики и события логов в ваш сборщик. Пример ниже включает экспорт OTLP для всех трех сигналов. CLAUDE_CODE_ENHANCED_TELEMETRY_BETA требуется только для трассировок; опустите его, если вы экспортируете только метрики и логи.
.env
Аутентификация и секреты
Три проблемы аутентификации имеют значение во время размещения:- Anthropic API: подпроцесс читает
ANTHROPIC_API_KEYиз своего окружения. Предоставьте его из вашего менеджера секретов или установитеANTHROPIC_BASE_URLдля маршрутизации вызовов модели через прокси, который внедряет ключ вне контейнера. См. Управление учетными данными для паттерна прокси и Настройка в быстром старте SDK для поддерживаемых методов аутентификации. - Входящие: поместите аутентификацию на шлюз перед контейнером агента. Агент должен получать предварительно аутентифицированные запросы и не должен быть компонентом, который проверяет токены пользователя.
- Исходящие инструменты: держите учетные данные инструмента вне окружения агента. Маршрутизируйте исходящие вызовы через прокси, который внедряет ключи API после того, как запрос покидает контейнер. Агент делает вызов; прокси добавляет учетные данные.
Масштабирование и параллелизм
Каждый сеанс работает в своем собственном подпроцессе, поэтому параллелизм на хосте ограничен тем, сколько подпроцессов может вместить его ОЗУ. Размер каждого хоста по этой формуле:sessionId. Закрепленный сеанс продолжает обращаться к одному контейнеру, и, следовательно, к одному работающему подпроцессу, пока он не будет вытеснен или контейнер не перезагрузится.
Стоимость
Стоимость токенов Anthropic обычно превосходит стоимость инфраструктуры контейнера на порядок или больше. Минимально подготовленный контейнер работает примерно за $0,05 в час, в то время как один долгий сеанс агента может потратить доллары на токены. См. Отслеживание стоимости для учета токенов на сеанс.Изоляция мультитенантности
Поведение SDK по умолчанию читает параметры и файлы памятиCLAUDE.md из файловой системы. В общем контейнере, обслуживающем нескольких арендаторов, эти файлы могут утечь контекст одного арендатора в сеанс другого арендатора.
Для изоляции арендаторов внутри общего контейнера:
- Передайте
settingSources: []в TypeScript илиsetting_sources=[]в Python, чтобы пропустить пользовательские, проектные и локальные параметры. - Установите
CLAUDE_CODE_DISABLE_AUTO_MEMORY=1вenv. Автоматическая память в~/.claude/projects/<project>/memory/загружается в системную подсказку независимо отsettingSources. См. Что settingSources не контролирует для других входных данных, которые загружаются безусловно. - Укажите
CLAUDE_CONFIG_DIRна каталог для каждого арендатора, чтобы арендаторы не делили глобальный конфиг~/.claude.json. Когда каждый каталог конфигурации обслуживает один рабочий каталог и вы не передаетеSessionStore, вы также можете установитьCLAUDE_CODE_PROJECT_DIR_NAMEвenv, чтобы сохранить пути транскрипта под ним короткими. Требуется TypeScript Agent SDK v0.3.234 или позже, или Python Agent SDK v0.2.140 или позже. - Используйте рабочий каталог для каждого арендатора. Передайте
cwdявно при каждом вызовеquery(). - Применяйте правила исходящего трафика для каждого арендатора на вашем прокси, такие как различные исходящие IP-адреса, учетные данные или списки разрешенных доменов, чтобы скомпрометированный арендатор не мог экспортировать данные через политику исходящего трафика другого арендатора.
tenantDir и configDir так, чтобы каждый арендатор получил путь, который не может прочитать никакой другой арендатор. В TypeScript env заменяет окружение подпроцесса, поэтому распространите ...process.env, чтобы сохранить унаследованные переменные, такие как PATH и ANTHROPIC_API_KEY. В Python env объединяется с унаследованным окружением.
Известные ограничения
Учитывайте их при проектировании развертывания.Устранение неполадок развертывания
Используйте этот раздел, когда агент, который работает на вашей машине, не работает в развёрнутом сервисе. Каждый элемент ниже называет сбой и ссылается на запись, которая его охватывает:- CLI не найден при запуске сервиса: в Python контейнер или менеджер сервисов запускает ваше приложение с другим
PATH, чем ваша оболочка, поэтому установка, которая работает локально, не видна процессу. В TypeScript сборка образа пропустила дополнительные зависимости SDK, илиpathToClaudeCodeExecutableуказывает на файл, который не существует в образе. См. Claude Code not found. - CLI есть в образе, но не запускается: Claude Code не может запуститься из двоичного файла, который не соответствует архитектуре контейнера или libc, или из файла, который потерял разрешение на выполнение при сборке образа. См. Failed to start Claude Code.
- Процесс Claude Code завершается посреди выполнения: ошибка, которую получает ваше приложение, зависит от языка SDK и от того, сообщил ли CLI перед этим о результате с ошибкой. Записи в разделе Выход процесса CLI охватывают каждое сообщение.
Следующие шаги
- Cookbook по хостингу: пошаговое руководство в виде notebook с развертываемым кодом для Docker, Modal и Kubernetes.
- Хранилище сеанса: сохранение транскриптов между хостами с помощью адаптера
SessionStore. - Наблюдаемость: экспорт OTEL трассировок, метрик и логов в ваш сборщик.
- Безопасное развертывание: сетевые элементы управления, управление учетными данными и усиление изоляции.
- Отслеживание затрат: учет токенов и затрат для каждого сеанса.