Интеграция с AI Гигачат
Введение
Гигачат - нейросеть от Сбера.
Главные плюсы ГГ - дает генерировать по АПИ картинки, не нужен VPN и зарубежная карта, относительно низкие цены на использование API.
Подключение к API Гигачат реализовано в пакете aichat.
Как реализовать с нуля подключение к ИИ Гигачат
Важный нюанс работы API Гигачат - установка сертификатов Минцифры на сервер. Также сервер должен быть не ниже Windows Server 20216 (на 2012 не работали запросы из за SSL).
Сначала создаем метод обновления токена gc_auth (токен доступа живет краткое время и его надо периодически обновлять).
Исходящий API метод gc_auth JSON POST
Request процедура:
CREATE PROCEDURE [dbo].[api_gc_auth_request]
@parameters ExtendedDictionaryParameter READONLY, -- (Key, Value2)
@username nvarchar(32) -- current site user
AS
BEGIN
-- preparing API request (URL, request settings, parameters)
-- SELECT 1 Msg, Result, Url (outer request url)
select '' Msg, 1 Result, 'https://ngw.devices.sberbank.ru:9443/api/v2/oauth' Url, 'application/x-www-form-urlencoded' ContentType,
'' Certpath, '' CertPass, '' RequestParameterForResponse, 0 Timeout
-- SELECT 2 PARAMETERS - request parameters
select 'RqUID' name, dbo.as_setting('gcRqUID', '') value, 'header' [type]
union
select 'scope' name, 'GIGACHAT_API_PERS' value, 'form' [type]
union
select 'Authorization' name, 'Basic '+dbo.as_setting('gcAuthorization', '') value, 'header' [type]
END
Request процедура - сохраняет токен в settings:
CREATE PROCEDURE [dbo].[api_gc_auth_response]
@response nvarchar(max),
@parameters ExtendedDictionaryParameter READONLY, --(Key, Value2 - same as in request)
@username nvarchar(32)
AS
BEGIN
-- process response after API request
-- SELECT 1
select '' Msg, 1 Result, @response Response
declare @token nvarchar(max) = '', @expires_at nvarchar(max)
if(isjson(@response)=1) begin
set @token = JSON_VALUE(@response, '$.access_token')
set @expires_at = JSON_VALUE(@response, '$.expires_at')
end
if(isnull(@token, '')<>'') begin
update as_settings set value = @token where code = 'gcToken'
update as_settings set value = @expires_at where code = 'gcTokenExpires'
end
-- SELECT 2 Outer actions
END
Чтобы токен постоянно обновлялся создаем периодическую задачу отправки в /syssp, который будет вызываться каждые 10 минут - с таким кодом:
CREATE PROCEDURE [dbo].[sync_gcCheckTokenExpiration]
@code nvarchar(128),
@result bit output,
@msg nvarchar(max) output
AS
BEGIN
set @result = 1
set @msg = 'no request'
DECLARE @Milliseconds BIGINT = try_cast(dbo.as_setting('gcTokenExpires', '0') as bigint) ;
if(@Milliseconds>0) begin
-- Переводим в секунды и сохраняем миллисекунды отдельно
DECLARE @Seconds INT = @Milliseconds / 1000;
DECLARE @FractionalMS INT = @Milliseconds % 1000;
-- Добавляем секунды и миллисекунды
declare @dt datetime = dateadd(hour,3, DATEADD(MILLISECOND, @FractionalMS, DATEADD(SECOND, @Seconds, '1970-01-01T00:00:00')) );
if(@dt < dateadd(minute, 5, getdate())) begin
select 'apirequest' type, 'gc_auth' code
set @msg = 'send auth request'
end
end else begin
select 'apirequest' type, 'gc_auth' code
set @msg = 'send auth request (expires=0)'
end
END
Далее мы можем использовать этот токен в вызове.
Приведем метод gc1, который является методом API для отправки запросов в подсистеме aichat.
Request процедура:
CREATE PROCEDURE [dbo].[api_gc1_request]
@parameters ExtendedDictionaryParameter READONLY, -- (Key, Value2)
@username nvarchar(32) -- current site user
AS
BEGIN
declare @text nvarchar(max) = (select value2 from @parameters where [key]='text')
declare @systemPrompt nvarchar(max) = (select value2 from @parameters where [key]='systemPrompt')
declare @profile nvarchar(max) = (select value2 from @parameters where [key]='profile')
declare @url nvarchar(max) = 'https://gigachat.devices.sberbank.ru/api/v1/chat/completions'
declare @token nvarchar(max) = dbo.as_setting('gcToken', '')
declare @g uniqueidentifier = (select try_convert(uniqueidentifier, value2) from @parameters where [key]='g')
declare @profileID int = (select id from as_apiProfiles where code = @profile)
declare @commands nvarchar(max) = ''
select @commands = @commands + isnull(prompt, '') + char(10) from as_apiProfileCommands
where profileID = @profileID and len(prompt)>3 and isActive = 1
if(len(@commands)>4) begin
set @systemPrompt = @commands + ' В остальных случаях не используй JSON с полем type. ' + @systemPrompt
end
declare @gcMaxTokens int = dbo.as_setting('gcMaxTokens',2000)
declare @json nvarchar(max) = (
select 'GigaChat' model,
cast(0 as bit) stream,
@gcMaxTokens max_tokens,
1 repetition_penalty,
'auto' function_call,
(
select role, content from (
/*
это если нужно историю запросов зацепить для чата
select top 10 'user' role, request content, created dt from as_apiProfileLog
where profileID = @profileID and g <>@g order by id desc
union
select top 10 'assistant' role, response content, dateadd(second, 5, created) dt from as_apiProfileLog
where profileID = @profileID and g <>@g and len(request)>0
order by id desc
union
*/
select 'system' role, isnull(@systemPrompt, '') content, dateadd(ms, -200, getdate()) dt where len(@systemPrompt)>4
union
select 'user' role, isnull(@text, '') content, getdate() dt ) t1
order by dt
FOR JSON PATH) messages
for JSON PATH,WITHOUT_ARRAY_WRAPPER
)
-- SELECT 1 Msg, Result, Url (outer request url)
select '' Msg, 1 Result, @url Url, '' ContentType,
'' Certpath, '' CertPass, '' RequestParameterForResponse, 0 Timeout
-- SELECT 2 PARAMETERS - request parameters
select 'Authorization' name, 'Bearer ' + @token value, 'header' [type]
union
select 'json' name, @json value, 'json' [type]
END
Response процедура:
CREATE PROCEDURE [dbo].[api_gc1_response]
@response nvarchar(max),
@parameters ExtendedDictionaryParameter READONLY, --(Key, Value2 - same as in request)
@username nvarchar(128)
AS
BEGIN
declare @g uniqueidentifier = (select try_convert(uniqueidentifier, value2) from @parameters where [key]='g')
declare @resp nvarchar(max) = @response
declare @tokens int = 0
if(ISJSON(@response) =1) begin
declare @t table (content nvarchar(max))
insert into @t
SELECT content FROM OPENJSON(@response, '$.choices')
WITH (
content NVARCHAR(MAX) '$.message.content'
)
declare @messages nvarchar(max) = ''
select @messages = @messages + isnull(content, '') + char(10)+ char(10) from @t
select @resp = @messages
set @tokens = JSON_VALUE(@response, '$.usage.total_tokens')
declare @msg nvarchar(max) = ''
-- обработка команды, если она есть в JSON
exec ai_processCommand
@s = @resp,
@ai = 'gigachat',
@username = @username,
@parameters = @parameters,
@msg = @msg OUTPUT
if(len(@msg)>0) set @resp = @resp + char(10)+ '
---
## Система:
'+ @msg
/*
{"choices":[{"message":{"content":"Привет! Всё отлично/ Как твои дела?","role":"assistant"},"index":0,"finish_reason":"stop"}],
"created":1755938924,"model":"GigaChat:2.0.28.2","object":"chat.completion",
"usage":{"prompt_tokens":16,"completion_tokens":28,"total_tokens":44,"precached_prompt_tokens":2}}*/
end
update as_apiProfileLog
set response = @resp,
jsonResponse = @response,
tokens = @tokens
where g = @g
-- SELECT 1
select '' Msg, 1 Result, @response Response
if(rtrim(ltrim(@response))= 'The remote server returned an error: (401) Unauthorized.') begin
-- SELECT 2
select 'apirequest' type, 'gc_auth' code
return
end
-- ищем картинки в
Заключение
Таким образом работает отправка запросов. Некоторые процедуры здесь не указаны (они являются часть подсистемы aichat).
В отдельной статье рассмотрим подключение обработки картинок через ИИ Гигачат.
Google поиск по нашей документации
- Шаг 1. Создать концепт проекта
- Шаг 2. Получить оценку бюджета (КП)
- Шаг 3. Заключить договор
- Шаг 4. Создать совместно техническое задание
- Шаг 5. Поэтапная реализация проекта