Назад к блогу

AWS открыла SDK для сборки ИИ-агентов: что внутри Strands Harness

AWS открыла SDK для сборки ИИ-агентов: что внутри Strands Harness

AWS открыла исходный код Strands Harness — прослойки над собственным SDK, которая позволяет собрать полностью настроенного ИИ-агента практически без конфигурации: с готовым выбором модели, встроенным веб-поиском, памятью и трассировкой. Материал разбирает, какие провайдеры поддерживаются, как работают уровни reasoning и кэширование промптов, и где у этой «батарейки в комплекте» проходят границы возможностей.

AWS выпустила Strands Harness — открытый SDK для создания и запуска ИИ-агентов на Python и TypeScript. Он ставится как пакет strands-harness для Python и @strands-agents/harness для TypeScript, а готовый агент собирается одним вызовом — в Python и TypeScript это делается по-разному, но результат один: полностью настроенный агент. Это не самостоятельный фреймворк с нуля, а слой над уже существовавшим Strands SDK: он даёт предварительно настроенного агента, тогда как SDK остаётся для тех, кому нужен контроль над каждым элементом цикла.

Что именно изменилось

Strands Harness — это harness. Собранный агент получается сразу, с настройками по умолчанию для модели, инструментов, памяти, сессий и управления контекстом. В монорепозитории это отражено каталогами harness-py/ и harness-ts/.

«Batteries-included agent» здесь означает, что web fetch и web search встроены и включены по умолчанию, управление контекстом, лимиты исполнения и observability работают до того, как написана хоть строка конфигурации, а агентный цикл по умолчанию трассирует каждое решение. Все эти значения по умолчанию можно переопределить.

Как выбирается модель и провайдер

Строка вида provider/name разбирается по первому символу /: если его нет, провайдером считается bedrock, а вся строка — именем модели; иначе провайдер — часть до /, имя — после. Поддерживаются bedrock, bedrock-mantle, anthropic, openai, google, ollama и litellm.

Для каждого провайдера заданы функция сборки модели, рекомендуемый уровень effort, допустимые уровни, флаг поддержки веб-поиска и флаг кэширования. bedrock и anthropic используют набор уровней Anthropic, openai и bedrock-mantle — набор OpenAI, google — свой, а ollama и litellm — пустой набор.

Уровень effort преобразуется в конкретное значение для провайдера: off даёт none, если провайдер его поддерживает, иначе null (поле reasoning не отправляется); auto — рекомендованный уровень; явно указанный уровень возвращается как есть, если он есть в наборе провайдера. Если уровень не входит в общий список допустимых, бросается ошибка о недопустимом значении; если валиден, но не поддерживается провайдером — ошибка с перечислением поддерживаемых уровней. Для семейств без поддержки уровней пустой набор означает, что явный уровень отклоняется, а по умолчанию берётся none.

Ограничения по инструментам

Нативный веб-поиск доступен не везде. Прежде чем включить его для модели, система проверяет, что у провайдера вообще есть поддержка webSearch. Для bedrock-mantle поиск разрешён только моделям с префиксами openai.gpt-5. или openai.gpt-6-, потому что другие семейства отклоняют этот инструмент с HTTP 400.

При включённом webSearch bedrock-mantle добавляет в параметры инструмент { type: 'web_search', external_web_access: true }, а обычный openai — { type: 'web_search' }.

Кэширование промптов

Кэширование запрашивается параметром caching и доходит до провайдера двумя путями. Harness сам настраивает Bedrock и Anthropic direct: расставляет cache points и кэширует определения инструментов, потому что инструменты стабильны между ходами. OpenAI, Gemini, bedrock-mantle и litellm кэшируют автоматически на стороне сервера, поэтому у них параметр кэширования помечен как неиспользуемый — opt-in не требуется. Gemini кэширует неявно на моделях 2.5 и новее, litellm — через свой OpenAI-совместимый бэкенд.

Флаг caching=true стоит у bedrock, bedrock-mantle, anthropic, openai, google и litellm, у ollama — false. Если caching запрошен, но провайдер его не поддерживает, выводится предупреждение с перечнем провайдеров, у которых кэширование есть.

Предыстория

Команда Amazon Q Developer начала строить ИИ-агентов в начале 2023 года, когда вышла научная работа ReAct, показавшая, что большие языковые модели могут рассуждать, планировать и действовать в своей среде. Тогда модели не были обучены вести себя как агенты и в основном тренировались для разговорного общения, поэтому для надёжной работы требовались сложные промпты, парсеры ответов и логика оркестрации, а получить синтаксически корректный JSON было трудно. Для прототипирования и развёртывания команда полагалась на разные сложные библиотеки агентных фреймворков, и даже с ними уходили месяцы настройки, чтобы довести агента до продакшена.

Со временем модели резко улучшили способности рассуждать и использовать инструменты, и команда поняла, что сложная оркестрация больше не нужна. Более того, некоторые из используемых фреймворков начали мешать полностью использовать возможности новых LLM: скорость создания и итерации агентов не росла, и на продакшен-готовность всё равно уходили месяцы. Поэтому команда начала строить Strands Agents, чтобы убрать эту сложность. Там, где раньше уходили месяцы от прототипа до продакшена, теперь новые агенты выпускаются за дни и недели.

Почему это сделали

Марк Брукер, VP и distinguished engineer в AWS, говорит, что Strands Harness располагается над существующим Strands SDK и даёт разработчикам предварительно настроенного агента, объединяя инструменты и вспомогательные механизмы для длительных задач с собственными настройками AWS по умолчанию. По его словам, SDK даёт строительные блоки, но разработчику всё равно приходится решать, как управлять контекстом, сохранять разговоры, интегрировать инструменты и направлять поведение агента.

AWS позиционирует Strands Harness как агента общего назначения, а не ассистента для программирования, хотя он и заимствует идеи у таких harness'ов, как Claude Code и Codex. Отличие, по словам AWS, в том, что разработчики могут развернуть Strands Harness в любом облаке по своему выбору — это отвечает распространённому желанию пользователей Claude Code и Codex запускать ту же конфигурацию в облаке. Брукер отмечает, что заставить прототип работать — один шаг, а оценка того, как решения влияют на производительность и стоимость, — другой; возможность, которую увидели в AWS, заключалась в том, чтобы упаковать эту инженерию в законченного агента общего назначения.

Цифры экономии

AWS обосновывает экономию собственным тестированием: для каждого harness усреднялся результат по шести бенчмаркам — ALFWorld, ContextBench, GAIA, WebShop, τ³-bench и Terminal-Bench 2.1 — и сопоставлялся со средней стоимостью одной задачи по тем же тестам. Против Claude Code и Codex Strands Harness оказался на 45% дешевле при сопоставимой точности. Эта цифра падает до 28%, если в сравнение добавить DeepSeek Harness, который, по словам AWS, был примерно на 14% дешевле Strands Harness на совпадающих прогонах.

Отдельно на Terminal Bench 2.1 Strands Harness с Fable 5 стоил на 77% меньше Claude Code — $56.29 против $248.05 на 89 прогонах, — при этом набрав 69.7 против 61.8. DeepSeek Harness был ещё дешевле ($40.30), но с более низким результатом 59.5. Причиной AWS называет настройки управления контекстом: Strands Harness обрезает особо крупные выводы инструментов, уплотняет контекст при превышении заданного порога доступного окна и пытается восстановиться внутри цикла агента при переполнении контекста.

Что это меняет на практике

Миграция описывается как переход от самостоятельной сборки агента к готовому harness. README советует начинать именно с harness, а к SDK спускаться позже, когда нужно самим владеть циклом агента и подключать инструменты, провайдеров моделей и память. Для Python установка harness выполняется командой pip install strands-harness, после чего агент создаётся и вызывается как функция с текстовой задачей. Прямое использование SDK требует установки pip install strands-agents strands-agents-tools и Python 3.10+. SDK позволяет глубже контролировать цикл, инструменты, провайдеров моделей, память, сессии и хуки — либо строить собственный harness с нуля.

Пакет strands-agents-tools при этом постепенно устаревает: репозиторий со временем будет заархивирован, а его инструменты получают замену. Устаревшие инструменты продолжают работать, но при вызове пишут предупреждение в лог начиная с указанной версии, и это предупреждение становится ошибкой в v0.9.0. Они также помечены @typing_extensions.deprecated, чтобы средства проверки типов и IDE сигнализировали об использовании до запуска. Например, sleep, editor и shell переносятся в strands.vended_tools; batch замены не требует, так как параллельное выполнение инструментов стало поведением SDK по умолчанию; think заменяется на встроенное расширенное мышление через конфигурацию модели; current_time — на ContextInjector; memory и retrieve — на MemoryManager с BedrockKnowledgeBaseStore; calculator, cron и environment — на shell; bright_data, slack, tavily, exa, search_video и chat_video — на официальные MCP-серверы соответствующих вендоров; http_request — на vended http_request и web_fetch; journal — на notebook; а diagram и rss замены не имеют.

Для эксплуатации Strands можно разворачивать как монолит, где агентный цикл и выполнение инструментов идут в одной среде, либо как набор микросервисов; есть референсные реализации для развёртывания за API на AWS Lambda, AWS Fargate или Amazon EC2. Можно разделить ответственность: агент вызывает инструменты через API, а инструменты работают в изолированном бэкенде, либо применить паттерн возврата управления, когда инструменты запускает клиент.

Для наблюдаемости Strands даёт инструментирование для сбора траекторий и метрик и через OpenTelemetry отправляет телеметрию в любой OTEL-совместимый бэкенд, а распределённая трассировка позволяет отслеживать запросы по компонентам. Strands Box — открытый sandbox для AI-агентов, который запускает агента внутри песочницы, принудительно обеспечиваемой ОС, и под политикой Dogwood; Box в preview, поэтому нужно фиксировать версию. Strands Shell — Bourne-совместимый shell, работающий внутри вашего процесса, с grep, sed, jq, curl, find и другими командами без fork, exec или сырых syscall, где вы объявляете доступные хостовые файлы, URL и учётные данные, а всё остальное агенту невидимо. Strands Evals позволяет валидировать агента до релиза: 25+ встроенных оценщиков проверяют отдельный ответ, полный ход или весь диалог, детекторы читают трейс и предлагают первопричину сбоя, а симуляторы играют пользователя или инструмент для оценки многоходового поведения и red-team атак.

Ограничения и открытые вопросы

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

Для инструментов shell и python_repl указаны платформенные ограничения: оба не работают на Windows. Для OpenAI Responses API требуется версия SDK openai>=2.0.0, иначе при импорте выбрасывается ImportError с рекомендацией обновиться или использовать OpenAIModel (Chat Completions).

Источники

Похожее