ReadyScript в своих продуктах предоставляет возможность генерации различного текстового контента с помощью LLM-моделей. Однако любой разработчик может также использовать генерацию в своих модулях.
Генерация происходит через специальный сервер ReadyScript, где у каждого пользователя есть свой стартовый баланс. Тарификация происходит в запросах (а не в токенах, как это может быть на некоторых других сервисах). В случае исчерпания стартового баланса, необходимо приобрести пакет запросов, чтобы продолжить выполнять запросы.
При необходимости, ReadyScript предоставляет возможность приобрести дополнительный модуль в маркетплейсе, который позволяет напрямую подключаться к различным GPT-сервисам. В этом случае пополнять баланс за доступ к API нужно будет непосредственно на том сервисе, который вы желаете использовать и тарификация там уже будет своя (обычно в токенах).
Для разработчика не будет иметь значения, какой GPT-сервис используется для генерации, так как мы создали обособленный от конкретного сервиса абстрактный набор классов и методов для генерации.
Важно отметить, что в ReadyScript мы предполагаем, что вы будете использовать stream режим генерации, так как генерацию в этом режиме очень удобно визуализировать, передавая частички текста в клиентскую часть. Но даже и для скрытой серверной генерации stream режим никак не мешает, так как в целом генерирует текст за сравнительно то же время, что и в синхронном режиме.
Переходим к конкретике...
В этом разделе речь пойдет о генерации через LLM ответа для произвольного запроса. Начнем с примера кода, который мы опишем дальше. Давайте создадим файл test.php в корне сайта.
Сперва нам необходимо получить объект профиля GPT-сервиса \Ai\Model\Orm\Service, через который мы будем выполнять запрос. Получить установленный в системе по умолчанию сервис можно с помощью метода \Ai\Model\ServiceApi::getDefaultService().
Получить конкретный профиль GPT-сервиса можно было бы с помощью следующего кода:
После получения профиля GPT-сервиса, нужно получить объект Типа сервиса(протокола) в помощью метода getServiceTypeObject() у объекта профиля.
Так как любой запрос должен корректно попадать в статистику, необходимо установить вспомогательные для статистики данные через метод setStatisticParams. По факту мы таким образом помогаем заполнить объект \Ai\Model\Orm\Statistic, поэтому возможные ключи можно посмотреть в описании полей этого ORM-объекта.
Далее происходит вызов основного метода, который запускает генерацию и возвращает Генератор (\Generator), т.е. итерируемый объект, состоящий из объектов \Ai\Model\ServiceType\ServiceChatResponse.
Рассмотрим подробнее интерфейс класса \Ai\Model\ServiceType\ServiceChatResponse.
Таким образом, вы можете получить результат генерации, проверив, что это последняя часть и вызвав метод getFullText().
ReadyScript предоставляет готовые инструменты для быстрого и простого добавления кнопок генерации к любым текстовым полям ORM-объектов на основе шаблонов запросов к ИИ (промптов). Предполагается, что такая кнопка будет генерировать текст для выбранного поля на основании данных из других полей.
Например, товару можно заполнить краткое описание, опираясь на названия товара. А полное описание можно заполнить на основе названия и краткого описания.
В любом случае нажатие на кнопку генерации просто направляет в GPT-сервис запрос, сформированный на базе шаблона промпта, который задается в разделе Разное -> AI - ассистент -> Шаблоны запросов к ИИ. А уже внутри шаблона прописываются переменные, на основании которых нужно сгенерировать текст.
Технически, чтобы к какому-либо ORM-объекту в ReadyScript можно было заполнять через ИИ поля, нужно описать класс Трансформер, наследник от \Ai\Model\Transformer\AbstractTransformer, затем зарегистрировать данный класс через обработку события ai.getTransformers, а затем обработать событие orm.init.... для необходимого объекта, применив к нему метод трансформера addAiToFields($ormObject).
Рассмотрим пример класса трансформера для объекта Товар \Ai\Model\Object\ProductTransformer.
Данный класс регистрировался бы следующим образом:
При разработке класса для вашего трансформера по аналогии нужно заменить объект Product из примера выше на ваш ORM-объект. Сегодня существует 3 типа поля, массив из которых должен возвращать метод initFields.
Технически, каждый тип поля описывает в системном промпте в каком формате вернуть результат.
Если у вас уже есть класс трансформера ваших объектов, то очень просто можно реализовать кнопку "Заполнить через ИИ" для выбранного списка объектов массово.
Покажем на примере страницы Товары -> Каталог товаров.
Для добавления кнопки необходимо обработать событие, которое вызывается сразу после формирования Помощника формирования скелета страницы административной панели. В случае со страницей из контроллера \Catalog\Controller\Admin\Ctrl, метода actionIndex, название события будет выглядеть так: controller.exec.catalog-admin-ctrl.index, где: