Определение серверного Tool
В NocoBase Tool (инструмент) отвечает за конкретные операции: запросы, запись данных и внешние вызовы. Серверный Tool обычно определяют с помощью defineTools() из @nocobase/ai и помещают в каталог src/ai/**/tools/ плагина.
Минимальная структура Tool
Серверный Tool определяется с помощью функции defineTools() из @nocobase/ai. Следующий Tool принимает имя и возвращает приветствие:
Если файл находится по пути src/ai/tools/greetDeveloper.ts, загр узчик использует имя файла greetDeveloper как итоговое имя Tool. Даже если в definition.name указано другое значение, при регистрации оно будет заменено именем файла.
Поэтому по умолчанию используйте одно и то же имя для файла, definition.name, ссылки в Skill и регистрации во фронтенде.
Параметры конфигурации Tool
Основные параметры defineTools():
Выбор scope непосредственно определяет, как Tool попадает в контекст ИИ-сотрудника:
По умолчанию рекомендуется SPECIFIED. Используйте GENERAL, только если возможность точно нужна каждому ИИ-сотруднику. Если администратор должен выбирать её отдельно для каждого сотрудника, используйте CUSTOM.
definition предназначен для модели
definition.description и definition.schema влияют на то, выберет ли модель этот Tool и как сформирует параметры. В описании нужно ясно указать три аспекта:
- Когда вызывать Tool
- Что означает каждый параметр
- Какие задачи не должен выполнять этот Tool
Для schema параметров рекомендуется использовать Zod:
Имя Tool также должно оставаться стабильным. Skill, конфигурация ИИ-сотрудника, фронтенд-карточки и сохранённые сообщения чата находят Tool по имени.
Что доступно в invoke()
Серверный invoke() получает три аргумента:
Через ctx доступны текущее приложение, база данных, данные аутентификации и параметры action. Например:
Tool должен возвращать структуру, по которой можно определить успех или ошибку. Встроенные Tool обычно используют следующую форму:
При ожидаемой бизнес-ошибке также возвращайте понятный статус и причину, чтобы модели не приходилось угадывать, завершилась ли операция успешно.
Использование каталога для длинного описания
Tool можно определить не только одним файлом, но и каталогом:
index.ts по умолчанию экспортирует результат defineTools(). Если существует description.md, его полное содержимое переопределяет definition.description; это удобно для длинных инструкций по использованию Tool.
Имя каталога documentSearch становится итоговым регистрационным именем.
Пример встроенного Tool: subAgentWebSearch
Файл packages/plugins/@nocobase/plugin-ai/src/ai/tools/subAgentWebSearch.ts демонстрирует полный серверный Tool:
В этой реализации есть несколько приёмов, которые можно использовать повторно:
- Ограничение доступа к инструменту конкретными сотрудниками или навыками с помощью
SPECIFIED - Проверка создаваемых моделью параметров с помощью Zod
- Получение конфигурации модели текущего ИИ-диалога из
ctx.action.params.values - Объединение нескольких независимых запросов в один ToolCall и их параллельное выполнение через
Promise.all() - Возврат структурированного результата с понятными источниками для дальнейшей обработки вышестоящей моделью
Связанные ссылки
- Разработка плагинов для ИИ-сотрудников — выбор уровня расширения
- Определение Skill — организация порядка вызова нескольких Tool с помощью Skill
- Полный пример: создание встроенного ИИ-сотрудника — рабочий пример Tool
- Добавление фронтенд-взаимодействия для Tool — интерфейс подтверждения и выбора для ToolCall

