Добавление фронтенд-взаимодействия для Tool
Некоторые Tool выполняются только на сервере и не требуют специального интерфейса. Если Tool должен позволять пользователю подтверждать, выбирать или редактировать параметры, для Tool с тем же именем можно зарегистрировать карточку, модальное окно или логику выполнения в браузере.
Фронтенд-карточка отвечает только за отображение ToolCall и взаимодействие с пользователем. Она не означает, что бизнес-логика Tool обязательно выполняется в браузере.
Если нужно лишь отобразить варианты, как в suggestions, и после выбора пользователя продолжить серверный invoke(), оставьте значение по умолчанию execution: 'backend'. Устанавливать execution: 'frontend' и реализовывать фронтенд-функцию invoke следует только тогда, когда фактической логике Tool нужен доступ к текущей странице браузера, FlowModel или состоянию редактора.
Сначала определите параметры и логику выполнения на сервере
Встроенный Tool suggestions находится здесь:
Его schema содержит и варианты, и окончательный выбор пользователя:
Согласно описанию Tool, при первом вызове модель должна сформировать только options. Поскольку для Tool не задано defaultPermission: 'ALLOW', по умолчанию применяется разрешение ASK: ToolCall приостанавливается и ждёт действия пользователя.
После выбора пользователя фронтенд с помощью decisions.edit() объединяет option с исходными параметрами и возобновляет ToolCall. Серверный invoke() возвращает выбранное значение:
Встроенная реализация также записывает результат выбора обратно в aiMessages.toolCalls, чтобы при повторном отображении истории сообщений по-прежнему было видно, какой вариант выбрал пользователь.
Создание компонента карточки
Фронтенд-карточка получает ToolsUIProperties:
Этот компонент демонстрирует общий способ использования decisions.edit() и обрабатывает повторные нажатия и параметры в виде JSON-строки. В готовой реализации также нужно учитывать режим чтения диалога, текущее активное сообщение и состояние исторического выбора. Полный пример находится в packages/plugins/@nocobase/plugin-ai/src/client-v2/ai-employees/tools/SuggestionsOptionsCard.tsx.
decisions предоставляет три операции:
Встроенный SuggestionsOptionsCard.tsx дополнительно обрабатывает следующие детали:
- Поддерживает две формы
options: массив и JSON-строку - Показывает loading, пока ToolCall ещё формируется
- Разрешает выбор только для ToolCall в состоянии
interrupted - Сразу отключает кнопки после нажатия, чтобы предотвратить повторную отправку
- Сохраняет и выделяет выбранный вариант в истории сообщений
- Разрешает действия только в текущем редактируемом диалоге
Регистрация в клиентском плагине
Имя регистрации во фронтенде должно точно совпадать с именем серверного Tool:
Если серверный файл называется src/ai/tools/developerChoice.ts, здесь нужно зарегистрировать developerChoice.
Встроенный suggestions регистрируется таким же образом:
Затем PluginAIClientV2.load() вызывает registerPluginAIClientV2BuiltinTools(this.ai.toolsManager) и объединяет карточку с определением серверного Tool с тем же именем.
Когда использовать карточку, модальное окно и выполнение во фронтенде
Ниже перечислены только основные параметры клиентского ToolsOptions. Полное определение типа находится в packages/core/client-v2/src/ai/tools-manager/types.ts.
Использование карточки
По умолчанию сначала используйте card. Карточка подходит для отображения состояния выполнения, кнопок подтверждения и небольшого числа вариантов непосредственно в ToolCall.
Использование модального окна
Добавляйте modal, когда содержимого много, нужен крупный предпросмотр или требуется сложное редактирование параметров.
Выполнение Tool в браузере
Если для серверного Tool задано execution: 'frontend', на клиенте также нужно предоставить invoke. Такой Tool подходит для чтения контекста текущей страницы, содержимого редактора или состояния FlowEngine, но не для записи данных, требующей защиты серверными разрешениями.
Полный пример: добавление карточки выбора для встроенного ИИ-сотрудника
После завершения полного примера создания встроенного ИИ-сотрудника следующий вопрос Dev Helper можно превратить в варианты для выбора. Для этого определите дополнительный Tool developerChoice и зарегистр ируйте для него фронтенд-карточку. Поместите серверный файл сюда:
Этот Tool объявляет варианты и принимает выбор пользователя:
Поскольку developerChoice.ts находится в каталоге tools/ Skill welcome-developer, он автоматически привязывается к текущему Skill. Однако привязка означает только, что модель может использовать этот Tool, а не то, что она обязательно его вызовет.
Также измените рабочий п роцесс в SKILLS.md, заменив прежние шаги 5–6 следующими:
Сохраните определённый выше компонент DeveloperChoiceCard, который используется повторно, по следующему пути:

