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провайдер моделей OpenAI, доступных через Amazon Bedrock, — в отличие от bedrock, который обслуживает модели Anthropic и другие семейства, 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хранилище памяти на базе базы знаний Amazon Bedrock; calculator, cron и environment — на shell; bright_data, slack, tavily, exa, search_video и chat_video — на официальные MCPоткрытый протокол, через который агенты подключаются к внешним серверам с инструментами-серверы соответствующих вендоров; http_request — на vended http_requestготовый инструмент из набора strands.vended_tools для обращения к API и web_fetch; journal — на notebook; а diagram и rss замены не имеют.
Для эксплуатации Strands можно разворачивать как монолит, где агентный цикл и выполнение инструментов идут в одной среде, либо как набор микросервисов; есть референсные реализации для развёртывания за API на AWS Lambda, AWS Fargate или Amazon EC2. Можно разделить ответственность: агент вызывает инструменты через API, а инструменты работают в изолированном бэкенде, либо применить паттерн возврата управления, когда инструменты запускает клиент.
Для наблюдаемости Strands даёт инструментирование для сбора траекторий и метрик и через OpenTelemetryоткрытый стандарт сбора и передачи телеметрии отправляет телеметрию в любой OTELсокращение для OpenTelemetry-совместимый бэкенд, а распределённая трассировка позволяет отслеживать запросы по компонентам. Strands Box — открытый sandbox для AI-агентов, который запускает агента внутри песочницы, принудительно обеспечиваемой ОС, и под политикой Dogwoodмеханизм, который решает, какие shell-команды, файловые операции, сетевые запросы и MCP-вызовы разрешены агенту; 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).