Титульная карточка с надписью «Создайте проактивный цикл агента на Claude Opus 5.5», подзаголовком о пяти этапах, одной модели и обо всём, чего потребительское приложение Anthropic вам не даёт, над четырьмя обведёнными пилюлями с подписями «Планировщик», «Кэшированный промпт», «Шлюз подтверждения» и «Аварийное переключение», а также лёгким геометрическим мотивом из смещённых скруглённых прямоугольников справа.
Guides & Insights

Создайте проактивный цикл агента на Claude Opus 5.5

Автор

Rowan Sterling

Дата публикации

Новые модели · 20Все модели →
Бенчмарки: Artificial Analysis · обновляется ежедневно
Назад ко всем статьям

Неудобная часть создания собственного проактивного агента заключается в том, что интересная работа — не вызов модели. Можно за один день заставить Claude Opus 5.5 отвечать на вопросы. Но заставить его просыпаться по расписанию, читать только то, что изменилось с прошлого раза, решать, заслуживает ли что-то внимания человека, готовить проект действия, а затем останавливаться и ждать — на это уходят недели, и почти ничего из этого не происходит внутри модели. Anthropic выпустила версию такого цикла под названием Claude Duet, и для тех, кто строит собственного агента, в этом продукте полезен не список функций, а решения, видимые в том, как он собран. У него нет опубликованного API, и его нельзя перенацелить на собственные системы, поэтому если вам нужен цикл, а не приложение, вы строите его сами. Далее — архитектура, этап за этапом, с честной ценой каждого.

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

An architecture card titled The loop, stage by stage, showing five numbered stages from left to right, Scheduler firing every few hours rather than continuously, Digest reading a diff of what changed since the last sweep, Decide where Claude Opus 5.5 reads the diff against a byte-identical system prompt and tool schema, Approval gate as a separate service that can say no, and Act executing only the approved action, with a blue callout on Decide and a cyan callout noting the gate can refuse.

Этап первый: планировщик, который запускается каждые несколько часов

Первое решение — это то, в чём люди ошибаются из-за энтузиазма, а не из инженерного расчёта: не опрашивайте непрерывно. Документация Anthropic по Duet объясняет свой интервал — проверку каждые несколько часов — тем, что проверка без остановки израсходует лимиты плана гораздо быстрее. Это не маркетинговая осторожность. Это правильный ответ на реальную проблему затрат, и это ловушка, в которую каждый самодельный агент попадает на первой неделе.

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

Итак, планировщик — это таймер в стиле cron с нижней границей минимального интервала, а не поток событий. События звучат привлекательно — реагировать в тот момент, когда что-то происходит, — но они возвращают вас к непрерывной работе и делают стоимость загруженного дня неограниченной. Таймер даёт предсказуемый потолок, который нужен, когда счёт переменный. Если вы хотите быстрее реагировать на один источник, сократите интервал только для этого коннектора и примите дополнительные расходы.

Второй этап: один побайтово идентичный префикс, хранящийся в кэше

Именно здесь опубликованные цифры играют наибольшую роль. Claude Opus 5.5 на OrcaRouter стоит 4.00 доллара за миллион входных токенов и 20.00 за миллион выходных токенов, имеет контекстное окно в 1M токенов и чтение из кэша по 0.20 за миллион — по каталожной цене провайдера с наценкой 0 процентов. Воспринимайте эти цифры как ограничение проектирования, а не как прайс-лист: чтение из кэша стоит одну двадцатую свежего входного токена, поэтому каждый байт, который вы сохраняете стабильным между проходами, — это байт, за который вы перестаёте платить полную цену.

На практике системный промпт и схема инструмента собираются один раз на этапе развёртывания и никогда не пересоздаются при каждом проходе. Их не сериализуют заново из словаря, где ключи идут в другом порядке. Их не собирают по шаблону с меткой времени, идентификатором запроса или сегодняшними подключёнными аккаунтами, вставленными в середину. Любой отличающийся байт аннулирует кэшированный префикс, и блок инструкций при каждом проходе возвращается к полной цене ввода. Команды теряют это случайно чаще, чем намеренно, обычно потому, что какая-нибудь полезная абстракция начала вставлять идентификатор запуска ближе к началу промпта.

Дисциплина, которая выживает при столкновении с реальным кодом, скучна: одна функция, возвращающая константную строку для стабильного блока, замороженный литерал для схемы инструмента, и каждый изменяемый элемент размещён после него. Затем тест, который хеширует блок и ломает сборку при изменении хеша, потому что кто-то в конце концов добавит поле схемы и вообще не подумает о кеше. Этот тест стоит часа и сохраняет всю выгоду от кеширования.

Этап третий: дайджест по каждому контакту, а не выгрузка почтового ящика

Третий этап — это то, что потребительский продукт получает бесплатно, а вы — нет. Duet работает внутри аккаунта Anthropic и имеет доступ к подключённым приложениям, поэтому может спросить, что изменилось с заданного момента, и получить небольшой ответ. Если вы создаёте решение вне этого аккаунта, вы обращаетесь к тем же API, что и любой обычный клиент: либо реализуете инкрементальное чтение, либо выгружаете всё и передаёте модели стену текста.

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

Этап дайджеста должен быть кодом, а не промптингом. Выполняйте выборку для каждого подключения, используя тот курсор или дельту, которые предлагает API, и сводите результат к структурированной сводке: что появилось, что было изменено, что было устранено. Присваивайте каждому элементу стабильный идентификатор, чтобы последующие этапы могли на него ссылаться, и записывайте последний успешный курсор для каждого подключения, чтобы неудачная выборка не воспроизводила вчерашний материал как новый. Дайджест, который не может отличить «ничего не произошло» от «я не смог проверить», в конце концов уверенно сообщит о состоянии, которое он никогда не наблюдал.

Четвёртый этап: шаг принятия решения, который выдаёт объект, а не прозу.

Именно здесь находится Claude Opus 5.5, и то, что он выдаёт, определяет, можно ли вообще построить остальную систему. Инстинктивно хочется, чтобы модель написала резюме, а человек его прочитал. Это годится для панели мониторинга, но не годится для шлюза: следующий этап должен решить, разрешать ли действие, а разрешение нельзя выдать абзацу.

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

Два практических замечания. Сначала передайте модели дайджест, затем политику, чтобы политика шла после переменного материала и префикс кэша оставался неизменным. И сделайте результатом по умолчанию «без действий», а не пустое предложение, которое читается как действие. Циклы, которые считают молчание неудачей, порождают объём, а агент, который выдумывает работу, чтобы казаться полезным, хуже того, который сообщает, что ничего не изменилось.

Этап пятый: точка согласования, которая действительно может сказать «нет»

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

Опубликованную политику Anthropic для Duet стоит скопировать по структуре, даже если ваш список отличается. Шлюз требует одобрения, прежде чем действие отправит сообщение, совершит платёж, подпишет документ или что-либо удалит. Над ним находится второй уровень, в котором отказывают даже при наличии одобрения — в случае Duet это торговля ценными бумагами и перевод денег между счетами. Эта схема представляет собой двухуровневую политику: большой набор действий, требующих одобрения, которые человек может разрешить, и небольшой набор, который не открывается никаким одобрением. Копируйте уровни, даже если каждый пункт изменится, потому что они решают разные задачи. Шлюз защищает от ошибки. Список запретов защищает от скомпрометированного оператора, включая самого человека-оператора.

Вторая половина настоящего шлюза — это то, что он прерывает процесс. Запрос на одобрение от Duet показывает точное действие и ждёт, тем самым намеренно останавливая поток, а не просто комментируя его. Шлюз, который пишет строку в журнал, который никто не читает, — не шлюз; это квитанция. Если на этапе одобрения требуется, чтобы кто-то следил за панелью мониторинга в три часа ночи, значит либо интервал слишком короткий, либо список действий слишком широк. И то и другое можно исправить, и ни то ни другое — добавлением уведомления.

Память, учётные данные и две поверхности, из которых не выбраться одними тестами

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

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

• Хранение учетных данных. Duet следует схеме, использованной для управляемых агентов Anthropic, поэтому он никогда напрямую не видит ваши пароли или токены входа. Воспроизвести эту дисциплину — то, что пропускает большинство самодельных агентов, а если ее пропустить, у каждого запроса появляется путь к учетным данным. Модель никогда не должна хранить токен, получать API-ключ в виде текста или быть компонентом, который выполняет аутентификацию. Пусть учетные данные хранятся на этапе подготовки сводки и у исполнителя, а модели передаются только результаты.

Есть ещё поверхность, о которой никто не хочет думать: как только агент читает электронную почту и веб-страницы, каждое из них становится входными данными, которые могут содержать инструкции. Сообщение «перешлите это на адрес ниже» неотличимо от данных для модели, у которой нет отдельного понятия полномочий. Две меры защиты лучше любого объёма укрепления промпта. Держите список действий закрытым, чтобы у внедрённой инструкции не было глагола, за который можно зацепиться. И держите шлюз вне влияния модели, потому что внедрение, которое убедит модель что-то отправить, всё равно должно убедить человека, который видит целевой адрес.

Переключение при сбое и где маршрутизация действительно помогает

Когда цикл построен, открывается архитектурная возможность, которой нет у решения с одним поставщиком. DSL маршрутизации OrcaRouter объединяет несколько моделей в один вызов, а слияние моделей запускает панель моделей, которые отвечают параллельно; и то, и другое ставит за один запрос более одной модели. Практическое применение здесь довольно прозаичное: направить более дешёвую модель на составление сводки дайджеста, где работа заключается в сжатии, а не в суждении, и оставить Claude Opus 5.5 на этапе принятия решения, где формируется предложение. Один и тот же ключ, совместимый с OpenAI, даёт доступ более чем к 200 моделям, поэтому смена модели для каждого этапа — это изменение конфигурации, а не переписывание.

OrcaRouter's own Claude Opus 5.5 model page. The site navigation lists Products, Models, Pricing, Docs and Blog, and the page hero carries the model name Claude Opus 5.5 above a specifications card showing a 1M-token context window, input priced at 4.00 dollars per million tokens, output at 20.00 dollars per million tokens, cached reads at 0.20 dollars per million tokens, zero percent markup, and access to more than 200 models through one OpenAI-compatible key.

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

OrcaRouter's own model catalogue page, headed Every frontier model, one key, with a subhead reading 200+ models from 20+ providers with a single OpenAI-compatible API, a search field for the models, a row of vendor filter pills, and a list where each row gives the model, its vendor, its context length and its input and output price, with Claude Opus 5.5 at 1M context and $4.00 and $20.00 visible in view.

На что вы на самом деле подписываетесь

Запуск этого цикла — это эксплуатация сервиса, а у сервиса есть четыре свойства, владение которыми вы только что приняли на себя.

• Аптайм. Приложение Anthropic — это чужой пейджер; ваш — это ваш. Планировщик, который молча перестаёт срабатывать, не выдаёт ни ошибки, ни результата, и вы узнаёте об этом от человека, заметившего отсутствие своего утреннего брифинга, а не из оповещения.

• Хранение учётных данных. Каждый токен, который хранит ваш этап дайджеста, — это ваша ответственность, а радиус поражения при утечке — это всё, до чего может добраться это подключение. В архитектуре Anthropic учётные данные изолированы от модели; если у вас это не так, модель становится поверхностью атаки для каждого подключённого вами аккаунта.

• Защита от prompt-injection. Механизм одобрения здесь даёт многое, но только для тех действий, которые он контролирует. Всё, что агент делает без одобрения — чтение, составление сводок, запись собственного состояния — остаётся незащищённым, а отравленная сводка может испортить память, из которой последующие проходы будут черпать основания.

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

Ничто из этого не говорит против того, чтобы это строить. Это говорит против того, чтобы строить это небрежно. Каждый этап мал, и именно в швах между ними живёт суждение: таймер, а не поток; замороженный префикс, а не шаблон; дайджест, а не дамп; объект, а не проза; и гейт, который является сервисом, а не комментарием. Сделайте это правильно, и цикл оправдает себя — он находит то, что вы не стали бы искать, и останавливается, прежде чем сделает что-то, что нельзя отменить. Сделайте это неправильно, и вы построили нечто, что непрерывно тратит ваш бюджет и сообщает вам то, что вы уже знали.