Интеграция с 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). 

В отдельной статье рассмотрим подключение обработки картинок через ИИ Гигачат

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