tool_calls: конкретные вызовы с реальными, выбранными моделью аргументами.
Поверхность response agent firewall
инспектирует именно их, в момент, когда они покидают модель, и до того как
они достигнут цикла вашего агента. Это поверхность, где вы фильтруете то, что
модель реально решила сделать, с аргументами, которые она реально выбрала.
Эта страница покрывает use-case фильтрации на поверхности response — когда
тянуться за ней вместо inbound, один
твист вердикта, который она добавляет, и как она ведёт себя на стриме. О полном
словаре правил и семантике вердиктов см.
Схему правил и
Вердикты.
1. Фильтруйте вызовы инструментов в ответе llm, с аргументами в области
Стадияinbound видит инструменты, которые вы
рекламируете — только имена, пока никаких аргументов времени вызова. Стадия
response видит tool_calls, которые модель выдаёт, которые несут
аргументы, выбранные моделью. Это вся причина фильтровать здесь: это
единственная поверхность, которая видит фактический вызов + аргументы для
выполняемого клиентом (не-MCP) инструмента, так что
клаузы аргументов,
последовательности и правила состояния прогона все приземляются на response.
Различие в одну строку:
| Стадия | Видит | Используйте, чтобы |
|---|---|---|
inbound | Рекламируемые определения инструментов | Сделать инструмент невидимым для модели |
response | Выданные tool_calls + аргументы | Отфильтровать вызов, который модель реально сделала |
inbound отвечает, какие инструменты существуют; response отвечает,
что модель сделала с одним из них. Тянитесь за response (или оставьте
stage пустым, чтобы покрыть оба), когда инструмент законно появляется в
некоторых запросах, но конкретный его вызов опасен — или когда вы
контролируете только цикл агента, а не набор рекламируемых инструментов.
Правило без
stage выполняется на каждой поверхности, включая response.
Привязывайте к response только когда правило должно только инспектировать
выданные вызовы — например, клауза аргумента, которой всё равно нечего
сопоставлять на поверхности inbound. См. Стадии.2. Один конкретный пример
Разрешитеshell.exec в целом, но уберите его из ответа модели в тот момент,
когда его аргумент command выглядит деструктивным. В консоли рабочего
пространства откройте политику (или создайте её)
и добавьте правило, привязанное к поверхности response:
args_match_json — JSON-строке,
содержащей {"clauses":[…]}, где каждая клауза — тройка path / op / value
(op — один из eq, contains, regex, gt, lt). Форма консоли строит её
за вас; сырая форма показана здесь, чтобы имя поля было однозначным.
Инструмент остаётся рекламируемым — модель всё ещё может предложить
shell.exec — но когда выданный вызов несёт деструктивный command, firewall
убирает этот tool_call из ответа до того, как ваш агент его увидит. Безобидный
shell.exec (скажем, ls -la) проходит нетронутым. Это паттерн «разреши
инструмент, ограничь вызов», ради которого существует поверхность response;
клауза аргумента — то, что делает это возможным.
3. Что делает вердикт на поверхности response
Поверхность response инспектирует каждый выданныйtool_call и переписывает
ответ на месте. Сохранённые вызовы пересылаются побайтно; меняется только
совпавший вызов:
deny → вызов убирается из ответа
deny → вызов убирается из ответа
Совпавший
tool_call убирается из ответа модели до того, как он достигнет
вашего агента. В отличие от inbound deny — который возвращает HTTP
400 с кодом firewall_blocked — deny поверхности response не проваливает
запрос; остальная часть ответа (другие вызовы инструментов, любой текст)
проходит, а нарушающий вызов просто отсутствует.sanitize → аргументы редактируются, вызов пересылается
sanitize → аргументы редактируются, вызов пересылается
Совпавшие подстроки в аргументах вызова заменяются отредактированными
движком аргументами, и очищенный вызов пересылается — полезно, когда
инструмент в порядке, но модель поместила секрет или значение PII в
аргумент. Sanitize редактирует только аргументы вызова инструмента; он
никогда не трогает содержимое, которое инструмент возвращает. Если движку
нечего подставить, вызов убирается (fail-closed). См.
Очистку ответов.
pending_approval → вызов убирается здесь, не удерживается
pending_approval → вызов убирается здесь, не удерживается
Удержания human-in-the-loop открываются на поверхности inbound, не
response. Правило
pending_approval, которое впервые совпадает на выданном
вызове, поэтому убирается (fail-closed) — сохранение его переслало бы
непроверенный вызов без человеческого решения. Создавайте HITL-удержания,
чтобы они срабатывали на inbound; см.
Подтверждения.allow / audit → вызов проходит, логируется
allow / audit → вызов проходит, логируется
allow и audit оба пересылают вызов; audit — обычный
default_verdict — записать всё, не блокировать ничего, пока вы не готовы
применять.4. Стриминг: удержан, затем отфильтрован
В не-стрим ответе весь ответ парсится и фильтруется сразу. На стримеtool_calls модели приходят как дельты на каждый индекс через множество
SSE-фреймов — и как только дельта переслана, ваш агент её уже имеет, и её
нельзя отозвать. Так что шлюз удерживает фреймы вызовов инструментов: они
никогда не пересылаются посреди стрима. В конце стрима firewall собирает каждый
вызов (имя + полные аргументы), вычисляет его и выдаёт только выжившие
вызовы.
Контентные фреймы всё равно стримятся нормально — текстовые токены достигают
вашего клиента по мере прибытия. Только фреймы
tool_call удерживаются для
вычисления, так что отклонённый или очищенный вызов отфильтровывается до того,
как собранный вызов инструмента доставлен. Семантика вердикта и правила
идентична не-стрим поверхности. О деталях на уровне фреймов см.
Внутренности стриминга и
Стриминг провайдеров.5. Разверните его безопасно
Сначала прогон правила вхолостую
Сначала прогон правила вхолостую
Вкладка Test в консоли прогоняет политику против образца вызова
инструмента и возвращает вердикт, совпавшее правило и причину — ничего не
диспетчеризуется, ничего не сохраняется. Подтвердите, что ваш глоб и клауза
аргумента совпадают с вызовом, который вы имели в виду, до привязки ключа.
См. Тестирование правил.
Shadow-режим для живого измерения
Shadow-режим для живого измерения
Включите shadow-режим, и каждый
применяющий вердикт — включая deny поверхности response — понижается до
audit, причина с префиксом [shadow] would …. Вы измеряете ровно то, что
правило убрало бы против реального трафика, до того как оно изменит хоть
один ответ.Подтвердите фильтрацию в журнале событий
Подтвердите фильтрацию в журнале событий
Каждое вычисление пишет событие firewall с вердиктом, поверхностью,
инструментом и совпавшим правилом. Отфильтруйте
журнал событий по поверхности
response, чтобы увидеть, как ваше правило срабатывает на выданных
вызовах, которые вы ожидали. См. Аналитику.6. Привяжите политику и кто может её настраивать
Политика ничего не делает, пока к ней не разрешится ключ. Привяжите в консоли, установивfirewall_policy_id на ключе,
или сделайте политику default рабочего пространства. Разрешение: привязанная
политика ключа (когда она существует и включена), иначе default рабочего
пространства — и отключённая привязанная политика откатывается к default
рабочего пространства. См.
Управление политиками.
Вся конфигурация выполняется в консоли под вашей сессией
(/api/workspace/firewall/*):
| Действие | Роль |
|---|---|
| Чтение политик, пресетов, обнаруженных инструментов, Simulate | Member |
| Прогон вхолостую (Test), чтение журнала событий и свёрток прогонов | Developer+ |
| Создание / редактирование / удаление правил и политик | Developer+ |
Связанное
Проверять аргументы
Клаузы аргументов, которые делают фильтрацию поверхности response точной.
Очистка ответов
Отредактировать секреты из аргументов вызова вместо его убирания.
Стадии Firewall
Как
response сравнивается с inbound, mcp и egress.Блокировать инструменты
Inbound-аналог: отклонить инструмент до того, как он предложен модели.
Опасные вызовы инструментов
Угроза, которую решает фильтрация ответа.
Справочник Firewall
Полный справочник правил + сопоставления.
