Генерация картинок через AI Gigachat

Введение

Гигачат позволяет генерировать картинки.

Здесь мы опишем как сненерировать картинки, сохранить их на сайт и затем вывести в чате на странице. 

Данный подход реализован в пакете aichat для подключения gc1. 

Как это работает

Используется обычный метод completions, но с параметром "function_call": "auto". 

ИИ отдает обычный ответ, но он содержит теги img с кодами ресурсов в src. 

Наша задача - извлечь эти коды и отдельно запросить ресурсы через внешнее действие download (скачивание файлов по токену). 

Документация Гигачат по извлечению картинки  - https://developers.sber.ru/docs/ru/gigachat/guides/images-generation?lang=curl

Детали реализации обработки картинок от Гигачат

Когда получили ответ от Гигачат (@resp) в процедуре response - отправляем картинки на обработку: 

  @response nvarchar(max),
  @parameters ExtendedDictionaryParameter READONLY,  --(Key, Value2 - same as in request)
  @username nvarchar(128)
AS
BEGIN
    -- .... тут идет обработка 
    -- ищем картинки в <img src и загружаем их через внешнее действие download..
   -- SELECT 2 Outer actions
   exec [dbo].[gc_processImages] @text = @resp,
        @username = @username, 
        @parameters = @parameters
   END

Процедура gc_processImages ищет картинки и скачивает их + заносит в таблицу ресурсов: 

CREATE PROCEDURE [dbo].[gc_processImages]
  @text nvarchar(max),
  @username nvarchar(128),
    @parameters ExtendedDictionaryParameter READONLY  
AS
BEGIN
  
    -- DECLARE @htmlString NVARCHAR(MAX) = '231231  <img src=''11'' fuse="true" /> 1324 <img src=''22'' /> 1231231231';

    -- 1. Оборачиваем теги <img> в фиктивный корневой тег <root>, чтобы сделать валидный XML
    -- 2. Заменяем одиночные кавычки на двойные (стандарт XML)
    DECLARE @xml XML = CAST( '<root>' +     REPLACE(@text, '''', '"') -- Заменяем ' на "
            + '</root>' AS XML               
    );

    -- 3. Извлекаем данные через XPath
    declare @t table (src nvarchar(max), fuse nvarchar(127))
    
    insert into @t
    SELECT 
        T.C.value('@src', 'NVARCHAR(MAX)') AS SrcValue,  T.C.value('@fuse', 'NVARCHAR(MAX)') AS Fuse
    FROM 
        @xml.nodes('/root/img') AS T(C);
      
      
      --  выполнение врешних действий по загрузке
      select 'download' type, '/uploads/img' path, 'https://gigachat.devices.sberbank.ru/api/v1/files/'+src+'/content' url, 
        30 maxFileSizeMb, 
        src + '.jpg' filename, 'Accept||application/jpg,Authorization||Bearer '+ dbo.as_setting('gcToken', '') headers
        from @t
    where fuse = 'true'

    insert into as_apiResources (uid, url, created, createdBy) 
    select src, '/uploads/img/'+ src+ '.jpg', getdate(), @username 
    from @t
  
END

Здесь используется следующий метод АПИ Гигачат - https://developers.sber.ru/docs/ru/gigachat/api/reference/rest/get-file-id

Определение таблицы ресурсов: 

CREATE TABLE [dbo].[as_apiResources](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[uid] [nvarchar](128) NULL,
	[url] [nvarchar](256) NULL,
	[itemType] [nvarchar](64) NULL,
	[itemID] [int] NULL,
	[created] [datetime] NULL,
	[createdBy] [nvarchar](128) NULL,
 CONSTRAINT [PK_as_apiResources] PRIMARY KEY CLUSTERED 
(
	[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO

На странице, где выводится переписка нам надо найти все картинки и для них сделать загрузку и обновление путей.  

При загрузке таблицы вызываем JS функцию обработки.

var processGCImages = function(options) {
    var els = [];
    $('.as-markdown img[fuse]').each(function() {
        var src = $(this).attr('src')
        if (!src.startsWith('http') && !src.startsWith('/')) els.push(src);
    });
    if (els.length) {
        as.sys.request("gc", "getResources", {
            data: {
                els: JSON.stringify(els)
            },
            onSuccess: function (data) {
                if (data.result && data.data && data.data.length) {
                    for(var i = 0; i< data.data.length; i++){
                        var item = data.data[i];
                        $('.as-markdown img[src='+item.uid+']').attr('src', item.url);
                        
                    }
                }
            }
        });
    }

}

$(function() {
    as.crud2callbacks["apiChatItems_getItems"] = function(options) {
        processGCImages(options);
    }
});

И последнее - реализация процедуры, которая по кодам ресурсов отдает обратно  пути к этим ресурсам: 

CREATE PROCEDURE [dbo].[request_gc_getResources]
	@parameters ExtendedDictionaryParameter READONLY,  
	@username nvarchar(32)
AS
BEGIN
    declare @els nvarchar(max) = (select value2 from @parameters where [key] = 'els')
    -- SELECT 1 Msg, Result
	select '' Msg, 1 Result

    -- SELECT 2 Основные данные в виде произвольной таблицы
    select uid uid, url url from as_apiResources 
    where uid in (
        SELECT [value] 
        FROM OPENJSON(@els)
    )
END

Заключение

Подобрым образом можно реализовать генерацию картинок прямо в личном кабинете на сайте. Гигачат неплохо справляется с генерацией общих картинок, но при генерации более тонких моментов (например, известных людей) возникают неточности (тут многое также зависит от промпта). 

 

 

 

 

 

 

Страница-источник на сайте falconspace.ru