Python

GigaChat API на Python: пример запроса

Запрос к GigaChat API на Python обычно состоит из токена доступа, HTTP-запроса, JSON-тела с сообщениями и обработки ответа. Токен нельзя хранить прямо в коде: положите его в переменную окружения и читайте через os.environ

Конкретный способ получения токена и актуальные адреса лучше сверять в документации вашего аккаунта GigaChat. В статье ниже показан практический шаблон клиентского запроса, который легко адаптировать под свои доступы

Что понадобится

Установите библиотеку requests

pip install requests

Сохраните токен в переменную окружения

export GIGACHAT_TOKEN='ваш_токен'
$env:GIGACHAT_TOKEN = 'ваш_токен'

После этого Python сможет прочитать токен без записи секрета в файл со скриптом

Минимальный POST-запрос

import os
import requests

url = 'https://gigachat.devices.sberbank.ru/api/v1/chat/completions'
token = os.environ['GIGACHAT_TOKEN']

payload = {
    'model': 'GigaChat',
    'messages': [
        {
            'role': 'user',
            'content': 'Объясни список в Python простыми словами'
        }
    ],
}

response = requests.post(
    url,
    headers={'Authorization': f'Bearer {token}'},
    json=payload,
    timeout=30,
)

response.raise_for_status()
data = response.json()

print(data)

В этом примере есть четыре важные части: адрес метода, заголовок Authorization, JSON с моделью и сообщением, проверка HTTP-статуса через raise_for_status()

timeout=30 нужен обязательно. Без таймаута скрипт может зависнуть, если сеть или API не отвечают

По этой теме полезно отдельно посмотреть Составьте еженедельное расписание занятий, чтобы расширить контекст и сравнить подходы

По этой теме полезно отдельно посмотреть Аннотации типов для декораторов в Python, чтобы расширить контекст и сравнить подходы

Вынести запрос в функцию

Так код проще переиспользовать

import os
import requests

GIGACHAT_URL = 'https://gigachat.devices.sberbank.ru/api/v1/chat/completions'

def ask_gigachat(prompt: str) -> dict:
    token = os.environ['GIGACHAT_TOKEN']

    payload = {
        'model': 'GigaChat',
        'messages': [
            {'role': 'user', 'content': prompt}
        ],
    }

    response = requests.post(
        GIGACHAT_URL,
        headers={'Authorization': f'Bearer {token}'},
        json=payload,
        timeout=30,
    )
    response.raise_for_status()
    return response.json()

answer = ask_gigachat('Составь план урока по циклам Python')
print(answer)

Функция получает текст запроса, собирает JSON, отправляет запрос и возвращает разобранный JSON-ответ

Достать текст ответа

У API-ответов обычно есть служебные поля. В чатовых API текст ответа часто лежит внутри первого элемента choices

def extract_text(data: dict) -> str:
    return data['choices'][0]['message']['content']

data = ask_gigachat('Напиши короткое приветствие')
text = extract_text(data)

print(text)

Если структура ответа изменилась или пришла ошибка, такой код может вызвать KeyError или IndexError. Для учебного примера это нормально, но в рабочем скрипте лучше сделать безопасную проверку

def extract_text_safe(data: dict) -> str:
    choices = data.get('choices') or []

    if not choices:
        return ''

    message = choices[0].get('message') or {}
    return message.get('content', '')

Обработка ошибок

Минимальная рабочая обработка ошибок может выглядеть так

import os
import requests

GIGACHAT_URL = 'https://gigachat.devices.sberbank.ru/api/v1/chat/completions'

def ask_gigachat(prompt: str) -> str:
    token = os.environ['GIGACHAT_TOKEN']

    payload = {
        'model': 'GigaChat',
        'messages': [{'role': 'user', 'content': prompt}],
    }

    try:
        response = requests.post(
            GIGACHAT_URL,
            headers={'Authorization': f'Bearer {token}'},
            json=payload,
            timeout=30,
        )
        response.raise_for_status()
    except requests.exceptions.Timeout:
        return 'API не ответил за отведенное время'
    except requests.exceptions.HTTPError as error:
        return f'HTTP-ошибка: {error.response.status_code}'
    except requests.exceptions.RequestException as error:
        return f'Ошибка запроса: {error}'

    data = response.json()
    choices = data.get('choices') or []

    if not choices:
        return 'Ответ пришел без текста'

    return choices[0].get('message', {}).get('content', '')

print(ask_gigachat('Дай пример цикла for на Python'))

В реальном приложении лучше не возвращать текст ошибки как обычный ответ модели, а логировать ошибку и отдельно показывать пользователю понятное сообщение

Как передать несколько сообщений

Чатовые API обычно принимают массив сообщений. Можно передать системное сообщение и запрос пользователя

payload = {
    'model': 'GigaChat',
    'messages': [
        {'role': 'system', 'content': 'Отвечай кратко и по делу'},
        {'role': 'user', 'content': 'Что такое функция в Python?'},
    ],
}

Так можно задавать стиль ответа, контекст и последующие сообщения диалога. Не отправляйте в API секреты, персональные данные и внутренние документы без понимания правил безопасности вашего проекта

Частые ошибки

Хранить токен прямо в коде или коммитить его в репозиторий

Не ставить timeout

Не вызывать raise_for_status() и не замечать HTTP-ошибки

Считать, что структура JSON всегда будет одинаковой

Печатать весь ответ в production-логах вместе с чувствительными данными

Игнорировать лимиты, стоимость запросов и правила использования API

Практические задачи

Сохраните токен в переменную окружения и прочитайте его через os.environ

Напишите функцию ask_gigachat(prompt), которая возвращает только текст ответа

Добавьте обработку ошибки 401

Добавьте timeout и проверьте, что скрипт не зависает бесконечно

Передайте два сообщения: системное и пользовательское

Сделайте простой CLI-скрипт, который спрашивает текст у пользователя и отправляет его в API

Базовый запрос к GigaChat API на Python строится вокруг requests.post(), заголовка Authorization, JSON с сообщениями и обработки ответа. Токен храните вне кода, запросы отправляйте с таймаутом, HTTP-ошибки проверяйте через raise_for_status()

Для рабочего проекта вынесите запрос в функцию, аккуратно извлекайте текст из JSON и отдельно обрабатывайте сетевые ошибки, ошибки авторизации и пустые ответы

Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные

Настройки cookie

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x