Навыки ИИ
Раздел предназначен для управления навыками, которые ИИ-ассистент WCS может использовать при подготовке ответа: источник, текст запроса, входные параметры и доступность каждого навыка.
Путь: «Настройки» → «Навыки ИИ».
Реестр навыков
В таблице «Навыки ИИ-ассистента» отображаются: # — идентификатор, «Название», «Источник», «Описание», «Статус» — «Активен» или «Неактивен», действия со строкой.
Для отбора записей доступны:
- поиск по всем полям;
- фильтр по источнику;
- фильтр по статусу: все, активные или неактивные.
Общие правила поиска, сортировки, настройки столбцов и выбора действий описаны в статье «Работа с таблицами».
Кнопка обновления повторно загружает список.

Создание навыка
- Нажмите «Добавить навык».

- Заполните форму.

- Заполните JSON в поле «Параметры».
- При необходимости измените признак «Активен».
- Нажмите «Создать».

Поля формы
| Поле | Обязательное | Назначение |
|---|---|---|
| «Название» | Да | Служебный идентификатор навыка. После создания изменить нельзя |
| «Описание» | Да | Пояснение, что делает навык и в каких вопросах его вызывать. По этому тексту ассистент решает, нужен ли навык |
| «Источник» | Да | Откуда брать данные: postgres, clickhouse, nats, rest или redis |
| «Запрос» | Да | Текст обращения к источнику: SQL, HTTP-запрос, ключ Redis или subject NATS |
| «Параметры» | Да | JSON со списком значений, которые ассистент подставляет в запрос |
| «Активен» | Нет | Если флажок снят, навык остаётся в реестре, но ассистент его не использует |
Требования к названию
«Название» — это код навыка. Пользователь чата это имя обычно не видит. После создания изменить название нельзя: при ошибке удалите навык и создайте заново.
Рекомендации:
- используйте латиницу, цифры и подчёркивание, как в подсказке поля
robots_low_battery; - не ставьте пробелы и знаки препинания;
- имя должно однозначно описывать задачу:
robots_with_errors,active_missions; - делайте имя уникальным, чтобы отличать навыки в таблице и в метках под ответом ассистента.
Параметры JSON
Поле «Параметры» описывает, какие значения ассистент может подставить в «Запрос», когда пользователь задаёт вопрос. Это не данные склада, а список аргументов навыка.
Для нового навыка редактор предлагает заготовку без аргументов:
{
"type": "object",
"required": [],
"properties": {}
}Такую заготовку оставляйте, если запросу ничего подставлять не нужно: например, всегда возвращать роботов с ошибками.
Если аргументы нужны, перечислите их в properties. Имя свойства должно совпадать с плейсхолдером в «Запросе»:
- для
postgresиclickhouseв SQL пишите:имя, например:min_battery; - для
restиredisпишите{{.имя}}, например{{.serial}}; - для
natsимя тоже можно вставить в subject тем же способом.
Пример: навык ищет роботов с зарядом ниже порога. В запросе — :min_battery, в параметрах — свойство с тем же именем:
{
"type": "object",
"required": ["min_battery"],
"properties": {
"min_battery": {
"type": "number",
"description": "Порог заряда в процентах",
"default": 20
}
}
}properties— список аргументов.required— какие аргументы обязательны. Если список пустой, ассистент может вызвать навык без них.type— вид значения: строка, число, целое.description— подсказка ассистенту, что брать из вопроса пользователя.default— значение, если пользователь порог не назвал.
Интерфейс проверяет только то, что в поле корректный JSON. Он не проверяет, совпадают ли имена с запросом и выполнится ли SQL, REST, Redis или NATS. Перед сохранением сверьте плейсхолдеры с properties и убедитесь, что запрос только читает данные.
Не переносите параметры из другого навыка, если запрос другой: ассистент подставит не те значения, и источник вернёт ошибку или пустой результат.
Примеры навыков
Ниже — образцы заполнения формы. Имена таблиц, путей API и ключей зависят от развёртывания: перед сохранением замените их на фактические. Не сохраняйте навыки, которые изменяют данные или читают секреты.
Примеры закрывают те же темы, что и подсказки пустого чата: состояние автопарка, ошибки, зарядка, транспортные задания и число миссий. Сами кнопки в чате из этих навыков не создаются.
Роботы с низким зарядом
- Название:
robots_low_battery - Описание: Возвращает роботов с зарядом ниже порога. Вызывай, когда спрашивают про заряд, разряженные AGV или состояние автопарка.
- Источник:
postgres - Запрос:
SELECT name, serial_number, battery
FROM robots
WHERE battery < :min_battery
ORDER BY battery ASC
LIMIT 50- Параметры:
{
"type": "object",
"required": ["min_battery"],
"properties": {
"min_battery": {
"type": "number",
"description": "Порог заряда в процентах",
"default": 20
}
}
}- Активен: да
Роботы с ошибками
- Название:
robots_with_errors - Описание: Возвращает роботов с активными ошибками. Вызывай при вопросах про аварии, неисправности и ошибки AGV.
- Источник:
postgres - Запрос:
SELECT name, serial_number, error_code, error_message, updated_at
FROM robots
WHERE error_code IS NOT NULL
ORDER BY updated_at DESC
LIMIT 50- Параметры:
{
"type": "object",
"required": [],
"properties": {}
}Кто на зарядке
- Название:
robots_on_charger - Описание: Возвращает роботов, которые сейчас заряжаются. Вызывай, когда спрашивают, кто на зарядке или какие станции заняты.
- Источник:
postgres - Запрос:
SELECT r.name, r.serial_number, c.name AS charger_name
FROM robots r
JOIN chargers c ON c.id = r.charger_id
WHERE r.operating_mode = :mode- Параметры:
{
"type": "object",
"required": ["mode"],
"properties": {
"mode": {
"type": "string",
"description": "Режим робота на зарядке",
"default": "CHARGING"
}
}
}Активные миссии
- Название:
active_missions - Описание: Возвращает выполняемые миссии и транспортные ордера. Вызывай при вопросах про активные задания, очередь и сколько миссий идёт сейчас.
- Источник:
postgres - Запрос:
SELECT id, name, status, robot_name, started_at
FROM missions
WHERE status = :status
ORDER BY started_at DESC
LIMIT :limit- Параметры:
{
"type": "object",
"required": ["status"],
"properties": {
"status": {
"type": "string",
"description": "Статус миссии",
"default": "running"
},
"limit": {
"type": "integer",
"description": "Максимум строк",
"default": 20
}
}
}Статистика миссий за период
- Название:
missions_stats_by_day - Описание: Считает завершённые и ошибочные миссии по дням. Вызывай, когда нужны итоги за период, а не текущий снимок склада.
- Источник:
clickhouse - Запрос:
SELECT
toDate(finished_at) AS day,
countIf(status = 'completed') AS completed,
countIf(status = 'failed') AS failed
FROM missions
WHERE finished_at >= now() - INTERVAL :days DAY
GROUP BY day
ORDER BY day- Параметры:
{
"type": "object",
"required": ["days"],
"properties": {
"days": {
"type": "integer",
"description": "Глубина периода в днях",
"default": 7
}
}
}Карточка робота через REST
- Название:
get_robot_by_serial - Описание: Получает карточку робота по серийному номеру через API WCS. Вызывай, когда нужен конкретный AGV:
AGV-000, статус, заряд, текущая миссия. - Источник:
rest - Запрос:
GET /robots?serial_number={{.serial}}- Параметры:
{
"type": "object",
"required": ["serial"],
"properties": {
"serial": {
"type": "string",
"description": "Серийный номер робота, например AGV-000"
}
}
}Кэш состояния в Redis
- Название:
robot_state_cache - Описание: Читает последнее известное состояние робота из кэша. Вызывай для быстрого снимка онлайн-статуса, если SQL не нужен.
- Источник:
redis - Запрос:
GET robot:state:{{.serial}}- Параметры:
{
"type": "object",
"required": ["serial"],
"properties": {
"serial": {
"type": "string",
"description": "Серийный номер робота"
}
}
}Текущее состояние по NATS
- Название:
live_robot_state - Описание: Запрашивает актуальное состояние робота по NATS. Вызывай, когда нужны живые данные, а не запись из базы.
- Источник:
nats - Запрос:
wcs.robots.state.{{.serial}}- Параметры:
{
"type": "object",
"required": ["serial"],
"properties": {
"serial": {
"type": "string",
"description": "Серийный номер робота"
}
}
}Действия
В зависимости от прав пользователя доступны:
- «Включить» или «Отключить» — изменить статус навыка;
- «Редактировать» — изменить описание, источник, запрос, параметры и статус;
- «Открыть детали» — открыть форму без возможности редактирования;
- «Удалить» — удалить навык после подтверждения.
Удаление необратимо. Перед ним убедитесь, что навык больше не нужен пользователям ИИ-ассистента.
Связь с ИИ-ассистентом
Навыки относятся к AI-ассистенту WCS. Активный навык может быть использован при обработке подходящего запроса; под ответом ассистент может показать название навыка и время выполнения. Отключённый навык остаётся в реестре и в чате не вызывается.
Виджет ИИ-ассистента отображается при праве просмотра навыков ИИ. Настройка навыка не заменяет проверку доступа к данным на стороне backend.
Подсказки при открытии чата
При пустом диалоге ассистент показывает фиксированный набор вопросов:
- «Состояние автопарка»;
- «Роботы с ошибками прямо сейчас»;
- «Кто сейчас на зарядке?»;
- «Активные транспортные задания»;
- «Сколько миссий сейчас выполняется?».
Этот список задан в интерфейсе чата и не строится из реестра навыков. Новые навыки не добавляют кнопки, удаление или отключение навыков кнопки не убирает. Нажатие отправляет текст подсказки как обычное сообщение. Чтобы ассистент ответил данными склада, нужен активный навык, описание которого подходит к этому вопросу.

Если подходящего навыка нет
Запрос всё равно уходит ассистенту. Специальной ошибки «навык не найден» нет. Ассистент отвечает без обращения к источнику данных, под сообщением нет меток использованных навыков.
В таком ответе не будет актуальных сведений из WCS: ни списка роботов, ни числа миссий. Ассистент может пояснить, что данных нет, дать общий ответ или попросить переформулировать вопрос. Чтобы вопрос о складе опирался на систему, создайте активный навык с подходящим описанием и запросом.
Права доступа
Для ресурса «Навыки ИИ» предусмотрены отдельные действия:
- «Просмотр» — видеть раздел и открывать детали;
- «Создание» — добавлять навыки;
- «Редактирование» — изменять навык, включать и отключать его;
- «Удаление» — удалять навык.
Права назначаются через роли или прямые права пользователя. Общие правила описаны в статьях «Модель прав доступа» и «Роли».