Генерация картинок через 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
Заключение
Подобрым образом можно реализовать генерацию картинок прямо в личном кабинете на сайте. Гигачат неплохо справляется с генерацией общих картинок, но при генерации более тонких моментов (например, известных людей) возникают неточности (тут многое также зависит от промпта).
Google поиск по нашей документации
- Шаг 1. Создать концепт проекта
- Шаг 2. Получить оценку бюджета (КП)
- Шаг 3. Заключить договор
- Шаг 4. Создать совместно техническое задание
- Шаг 5. Поэтапная реализация проекта