Работа с GigaChat API (аналог ChatGPT от Сбера)

Тэги: AI, Python, GPT, GigaChat, Сбер

GigaChat – это генеративная языковая модель, созданная Сбером (аналог ChatGPT). Вы можете использовать ее в своих проектах для решения задач и ответа на возникающие вопросы. Разберёмся как использовать ее API и какие есть бесплатные лимиты.

Регистрация

Для начала нужно зарегестрироваться. Для этого переходим по ссылке и нажимаем “Войти” либо “Попробовать”:

Затем нам нужно будет войти по Сбер ID либо СберБизнесс ID:

Разница в том, что у вас будут разные тарифы и льготы.

Для личного пользования:

Для ИП и ЮрЛиц:

Токен – это такая единица измерения. Токен может быть символом, несколькими символами, кусочком слова или словом целиком. В среднем в одном токене 3—4 символа, включая пробелы, знаки препинания и специальные символы. Подробнее о тарифах читайте тут.

Также важное отличие в том, что для личного пользования у вас будет всего один поток. А несколько потоков могут приобрести только владельцы бизнесс-аккаунтов.

Затем вы попадёте на страницу личного кабинета:

Тут можно сразу перейти в документацию чтобы почитать о возможностях.

Но вы здесь для того чтобы я упростил задачу на пару шагов, поэтому приступаем.

Для начала нам нужно составить запросы. Выглядеть схема работы будет так:

Запрос на получение токена -> сохранение токена -> запрос к гигачат

Получение токена

Для получения токена нам нужен Client Secret – его получаем, нажав на “Создать новый”. Увидим такое окно:

Вам высветится Client Secret и данные авторизации – скопируйте их и сохраните куда-нибудь, потому что больше вы тут их не увидите.

Работать я буду в python, но схема одинаковая для всех систем.

import requests

def get_token():
    url = "https://ngw.devices.sberbank.ru:9443/api/v2/oauth"

    payload='scope=GIGACHAT_API_PERS'
    headers = {
    'Content-Type': 'application/x-www-form-urlencoded',
    'Accept': 'application/json',
    'RqUID': '<ВАШ Client Secret>',
    'Authorization': 'Basic <ВАШИ Данные Авторизации>'
    }

    response = requests.request("POST", url, headers=headers, data=payload, verify='chain.pem')

    return response.json()

Обратите внимание на verify='chain.pem' – в документации об этом говорится вскользь и примеров нормальных нет. Но вам нужно скачать с госуслуг сертификат минцифры, чтобы запросы проходили нормально и соответственно указать путь к нему.
(Если вы под windows вам нужно будет просто объединить два файла в один)

Сделав запрос и получив токен, сохраните его и вы можете приступать к непосредственно работе с gigachat.

Запросы к gigachat

Для обращения напишем ещё функцию:

def get_answer(text, access_token):
    payload = json.dumps({
        "model": "GigaChat", #есть еще GigaChat-Pro (50к бесплатных) и GigaChat-Plus (платный)
        "messages": [
            {
            "role": "user",
            "content": text #ваш запрос
            }
        ],
        "temperature": 1,
        "top_p": 0.1,
        "n": 1,
        "stream": False,
        "max_tokens": 512, #максимальное кол-во использованных токенов
        "repetition_penalty": 1
    })

    headers = {
        'Content-Type': 'application/json',
        'Accept': 'application/json',
        'Authorization': f'Bearer {access_token}' #токен доступа
    }
    
    response = requests.request("POST", url, headers=headers, data=payload, verify='chain.pem')

    return response.json()

Все важное я прокомментировал в коде – тут мы уже получаем ответ на вопрос, вот в таком формате:

{
    "choices": [
        {
            "message": {
                "content": "Ответ GigaChat",
                "role": "assistant"
            },
            "index": 0,
            "finish_reason": "stop"
        }
    ],
    "created": 1714602175,
    "model": "GigaChat:3.1.24.3",
    "object": "chat.completion",
    "usage": {
        "prompt_tokens": 23,
        "completion_tokens": 128,
        "total_tokens": 151,
        "system_tokens": 204
    }
}

Создание изображений

Для того, чтобы генерировать изображения, используется та же языковая модель, но с доп сообщением (пример из доки):

def get_img_info(text, access_token):
    payload = json.dumps({
        "model": "GigaChat",
        "messages": [
            {
                "role": "system",
                "content": "Ты — Василий Кандинский"
            },
            {
                "role": "user",
                "content": text
            }
        ],
        "function_call": "auto"
    })

    headers = {
        'Content-Type': 'application/json',
        'Accept': 'application/json',
        'Authorization': f'Bearer {access_token}'
    }

    response = requests.request(
        "POST", url, headers=headers, data=payload, verify='chain.pem')

    return response.json()

(На базовой модели – изображения такие себе)

Также нам нужна функция скачивания изображения:

def get_img(fileid, access_token):
    url = f"https://gigachat.devices.sberbank.ru/api/v1/files/{fileid}/content"

    payload={}
    headers = {
        'Accept': 'application/jpg',
        'Authorization': f'Bearer {access_token}'
    }

    response = requests.request("GET", url, headers=headers, data=payload, verify='chain.pem')

    return response.content

Мы получаем ответ в виде текста + тега img – нам нужно вытащить именно тег img и то что у него в src. Для этого используем bs4:

    answer = get_img_info(message_text, access_token)
    answ = answer['choices'][0]['message']['content']

    images = re.findall(r'', answ)

    src = BeautifulSoup(image, 'html.parser').find('img').get('src')

    with open(f"newimg.png", "wb+") as img_file:
       img_file.write(get_img(src, access_token))

Итог

Сама модель – хуже GPT почти по всем фронтам, но хороша тем, что API работает без VPN и есть довольно много бесплатных запросов.

Теперь вы можете использовать api gigachat, встраивать его в ваши приложения, сайты и боты.

Я как раз написал бота в телеграм – просто для примера.

Также выложил код в GitVerse.

Связанные статьи: Бесплатный SSL в TimeWeb | Приложение из сайта (WebApp) | Монетизация телеграм-бота | Тёмная тема Safari |

12.05.2024
Михаил Гок