Skip to Content

Навыки ИИ

Раздел предназначен для управления навыками, которые ИИ-ассистент WCS может использовать при подготовке ответа: источник, текст запроса, входные параметры и доступность каждого навыка.

Путь: «Настройки» → «Навыки ИИ».

Реестр навыков

В таблице «Навыки ИИ-ассистента» отображаются: # — идентификатор, «Название», «Источник», «Описание», «Статус» — «Активен» или «Неактивен», действия со строкой.

Для отбора записей доступны:

  • поиск по всем полям;
  • фильтр по источнику;
  • фильтр по статусу: все, активные или неактивные.

Общие правила поиска, сортировки, настройки столбцов и выбора действий описаны в статье «Работа с таблицами».

Кнопка обновления повторно загружает список.

Создание навыка

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

Поля формы

ПолеОбязательноеНазначение
«Название»ДаСлужебный идентификатор навыка. После создания изменить нельзя
«Описание»ДаПояснение, что делает навык и в каких вопросах его вызывать. По этому тексту ассистент решает, нужен ли навык
«Источник»ДаОткуда брать данные: 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: ни списка роботов, ни числа миссий. Ассистент может пояснить, что данных нет, дать общий ответ или попросить переформулировать вопрос. Чтобы вопрос о складе опирался на систему, создайте активный навык с подходящим описанием и запросом.

Права доступа

Для ресурса «Навыки ИИ» предусмотрены отдельные действия:

  • «Просмотр» — видеть раздел и открывать детали;
  • «Создание» — добавлять навыки;
  • «Редактирование» — изменять навык, включать и отключать его;
  • «Удаление» — удалять навык.

Права назначаются через роли или прямые права пользователя. Общие правила описаны в статьях «Модель прав доступа» и «Роли».