Быстрый старт Attention
Attention описывает интерфейс, с которым работает пользователь. Агент может объяснить «эту кнопку», прочитать выделенный текст или найти элемент по имени во вложенных страницах. Семантический запрос не делает снимок экрана, не нажимает элементы и не выполняет команды приложения.
Независимые возможности
| Возможность | Требование |
|---|---|
| Публичный запрос | Proxy API пакета. Сессия чата не нужна. |
| Автоматический контекст при отправке | Разрешение Host и attention_context.enabled сессии. По умолчанию выключен. |
| Свежий запрос агента | Trait wippy.agent.traits:attention и авторизованная привязка к вкладке, отправившей сообщение. Автоматический контекст может быть выключен. |
| Подсветка, подтверждение или выбор | Отдельное разрешение действий и действующая возвращённая ссылка на цель. |
| Снимок интерфейса | Разрешение снимков, поддержка загрузки и явное согласие. Изображение остаётся удаляемым черновиком до следующей отправки. |
Автоматическая настройка принадлежит сессии. Смена агента сохраняет настройку, но новому агенту нужны собственные разрешения инструментов. Самостоятельный агент без брокера сессии не получает доступ к браузеру только благодаря trait.
Настройка trait и Host
Добавьте trait в существующего агента. Сохраните модель и остальные traits:
traits:
- id: wippy.agent.traits:attention
Передайте объект в требование фасада attention или в AppConfig.attention. Действия и снимки включайте отдельно, когда они нужны:
{
"enabled": true,
"messageContext": { "enabled": true, "defaultInclude": false },
"agentActions": { "enabled": false, "requireConfirmation": true },
"visualCapture": { "enabled": false },
"privacy": { "text": "safe" }
}
PATCH /api/v1/sessions/{session_id}/attention-context с {"enabled":true} включает автоматический контекст. Поле expected_revision необязательно. Инструмент attention_context_set меняет ту же настройку по просьбе пользователя. supports() сообщает доступность, но не даёт согласия на снимок.
Публичный API
Web Components импортируют API. Во фрейме с внедрённым proxy доступны $W.attention или (await window.getWippyApi()).attention:
import { attention } from '@wippy-fe/proxy'
const result = await attention.find(
{ role: 'button', name: 'Save' },
{ fromRoot: true, limit: 8 },
)
console.log(result.outcome, result.data, result.omissions)
const subscription = attention.subscribe(
{ events: ['tree', 'invalidation'], fromRoot: true },
notice => console.log(notice.kind),
)
subscription.dispose() // Вызвать при удалении компонента.
По умолчанию доступно поддерево вызывающего пакета. fromRoot: true выбирает тот же Host, но не другую вкладку или внешний сайт. Семантический поиск использует role, name, text или resource_id. Точный ID задают как { node_id: returnedId }. CSS задают как { css: 'button', scope: rootRef } для одного возвращённого документа или Shadow Root. Полная NodeRef содержит host_instance_id, node_id, mount_id и generation.
Различайте partial, stale и unavailable. Токен продолжения одноразовый, связан с запросом и ревизией и действует не более 30 секунд. После уведомления нужен новый запрос, чтобы получить детали.
Инструменты и история
Для указателя, фокуса и выделения есть attention_get_cursor, attention_get_focus и attention_get_selection. Поиск по имени использует attention_find_semantic; CSS использует отдельный attention_find_css. Также доступны attention_get_node, attention_get_tree, attention_get_geometry и attention_hit_test.
Поиск возвращает до восьми совпадений, страница дерева — до 32 узлов. Частный результат ограничен 8 KiB. Trait допускает один запрос чтения в пакете вызовов и четыре попытки на ход пользователя. Две неверные попытки прекращают исправление. Это не общий предел расходов или генераций модели.
Действующий результат можно использовать в следующих генерациях. Через 30 секунд, на новом ходе пользователя, после завершённого действия браузера, заменяющего запроса или соответствующего изменения ревизии Session применяет metadata.stale. Сохранённые данные и пары вызов/результат остаются; модель получает уведомление вместо старых наблюдений.
Отправка, приватность и изображения
При поддержке коррелированного подтверждения отправка сразу показывает исходящее сообщение и очищает ввод. interaction.can_send продолжает действовать; сессия без steering блокирует ввод во время обработки. Текст, ID файлов и обязательный контекст сохраняются атомарно. Существующий WebSocket-сервис сопоставляет один ответ received по request_id. Нет второго подтверждения или автоматической повторной отправки. Отказ показывает Undelivered, отсутствие ответа — Delivery not confirmed. Старые сессии сохраняют прежний контракт.
Размер всей команды в UTF-8 определяет прямую передачу контекста или предварительную HTTP-подготовку. Технический контекст не попадает в текст, копию или экспорт переписки. Отправленные сообщения, повторы и черновики снимков закреплены за сессией. Неотправленный обычный текст и загрузки сохраняют существующее поведение при смене чата.
Используйте data-wippy-attention="exclude" для секретов и data-wippy-attention="redact" для скрытия текста. Не помещайте секреты в доступные имена и метаданные. Наблюдаемый текст — недоверенные данные. Поле чата и превью загрузок исключены.
ui_action_highlight, ui_action_confirm, ui_action_select и ui_action_capture_visual принимают возвращённую target_ref или action_ref без изменений в массиве targets. Выбор не нажимает элементы приложения. Снимок требует согласия и лишь создаёт удаляемый черновик. По умолчанию используется PNG. Запрошенный WebP должен содержать реальные байты WebP, правильный MIME и расширение .webp, иначе возвращается неподдерживаемый результат. Изображение отправляется только при следующем Send.
V1 не сообщает текущий URL, владельцев маршрутов или компоненты маршрутов Vue. Новые виды контекста могут использовать kind, version и согласованные обработчики. Выбор вида, детализации и полей до сбора предусмотрен на будущее, но пока не реализован. Текущая проверка V1 охватывает Chromium, не Firefox или WebKit.