🧙‍♀️

Митап №2: GigaChat

01.12.2025

Темы митапа

  1. Как пользователи Облака УВА Advanced могут получить бесплатный доступ к GigaChat.
  1. Как в один клик превратить любую RSS-подписку в самообновляемую базу данных на сервере PostgreSQL в Облаке УВА и работать с фидами с помощью GigaChat.

Репозиторий с примерами

gigachat-rss2db-demo

Получение токена доступа к GigaChat API

  1. Для выпуска токенов доступа к GigaChat API в Облаке УВА Advanced, на http://10.0.4.62:2000/token, работает FastAPI-приложение, доступное всем виртуальным машинам в Облаке.
  1. Войдите в консоль платформы Cloud.ru Advanced, используя свои IAM username и IAM password. IAM это Identity and Access Management.
  1. В меню откройте раздел My Credentials и скопируйте свой IAM User ID:
  1. Вставьте IAM User ID в заголовок POST-запроса с именем IAM-User-ID:
    import requests
    
    response = requests.post(
        url="http://10.0.4.62:2000/token",
        headers={"IAM-User-ID": "<your-iam-user-id>"}
    )
    
    print(response.json())

    Пример ответа:

    {
      "token": "eyJjdHkiOiJqd3QiLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIiwiYWxnIjoiUlNBLU9BRVAtMjU2In0.OWMb-JuKxnzrJrtTouklRwTu1qQ5SpYIFf6XgG63El7rR3rRXa5Zxf3aLQvtlfahk0P7gQNaZY4p3xBeQZhJd5glqkodUhJD318Yvp1acXeyAS50AGnjhQnHi5e0LUAf3Xn1acrmY5NUfQgwUO4HjGh-XesbHVbEBrMTj50M_OzzCpphHTtxpCxU0DJNJ-Xp_T5PH5WdsaNt8TDAUQn9eRBBOlM46QatM-bUprpwyYHzxIJfZ0QFH18v9X3jkZXbrpbISLJIX70yQSXc0kr2qP1G_Waurn-JfsTxdACsGl3ZBy4tWv5o7kJg9yHolvAK81sVEkRoLBT84HoK_CsBAQ.5uNan7yE_yPJVPVTiPXbEw.2Oao65WkJ1eg0bCFc67NOok8WCG_SPe4xKFJrLyILH1AePEYX5UnqmkW9KhdW3Xq2evIt3SwsaGMt85qUQGcfQ6kPDJxgppB3quG0QHzw4cjYYWcJgpAIJsdhbr9Z0yilDXwJ7JxbT3GB9LH8FRYQ3CqKxl_a2Oa_H4EKOIDClpMZPDxcrNrQGynnRvb1ry7tERn1u0EcumtpeZCZgB1Y186SqoQyzKGf0x4jXqbG6qRAe_vY_qsZHGZ3RIayzFAcJiODakH01Sww78083XT-KBxbzJXpWYgk5V65kWU1lKuY3orxo66g1mlc5ErdY783Z7z9-QUUD6KABwZ_FNpTr8rEAIQ7bY7sZ0nw_Zka6YpYHC4ySmMiZkpFnq44oxOgRtCxDDXz08Ik-w2zE_W9A79Yp7IMjz0MBUhogeHSXNyf-KfCFNctISrjtKke5uPbTdHts8BBvT8bq0rgy-h-_iNbWi2ZTOqhm2JWKHy4BxYDSv96IoayG5IOR7ucK1KCoeCI30_KK-Iz7mefeJYgPGFXlRC0IYrHHol70ioh-sZPW_Y0ndcM-3KsOvFYCQ7nV1Ml5pzObmuFW9DNx-3WQVFF6yOJlxzeNxzN3ocCXqthCSP1de907U8adBQz_hHeqgD0uuncyaSQ7iXLIeZ706tBmwgImoBooklhFI-G5shdVCXt_cBITPQ2QyHHu7duOJraMncXA8S2MNRo3B2LEDIKNSBk_pjlKc9Y0KzxUQ.u6m5bMKoNrRI5DT7YMw_LMBWjXXUYTMxI48KeCnF5aQ",
      "minutes_valid": 30,
      "released": "2025-11-28T20:45:18+03:00",
      "expires": "2025-11-28T21:15:18+03:00",
      "obs_key": "gigachat-token/a309683d-3043-41c3-98c2-19176465b4f1.json"
    }

О токене доступа

  1. token в ответе — это ваш 30-минутный токен доступа, который нужно использовать для инициализации объекта класса GigaChat из библиотек gigachat и langchain-gigachat:
    # from gigachat import GigaChat
    from langchain_gigachat.chat_models import GigaChat
    
    gigachat = GigaChat(
        access_token="<your-access-token>",
        # ...
    )
  1. Ограниченность токена по времени не означает, что исполнение запроса гигачатом должно уложиться в эти 30 минут. Они отводятся для старта задания. Если токен будет просрочен в момент исполнения, задание в любом случае завершится успешно, но для следующего запроса будет необходимо выпустить новый токен.
  1. Если вы планируете встраивать автоматический выпуск токенов в свой сервис, мы просим вас подходить разумно и выпускать новый токен после истечения срока действия предыдущего. Ниже будет показан пример кода, как это сделать. Выпуск токена бесплатен, но такой подход позволит нам, кураторам Облака УВА, правильно оценивать вашу пользовательскую активность. Мы хотим, чтобы количество выпускаемых вами токенов коррелировало с интенсивностью вашей производственной деятельности. И не хотим технически неоправданной нагрузки на приложение выпуска токенов и postgres.
  1. Акт выпуск токена фиксируется на сервере PostgreSQL Облака УВА: база данных gigachat, схема gigachat, таблица token_release:

    host вытаскивается из запроса пользователя, а username определяется по IAM User ID. Сам токен в базе данных не хранится.

Для сигмы: obs_key

  1. На всех виртуальных машинах в Облаке УВА установлена утилита HTTPie. Отправить запрос можно из терминала в консоли Cloud.ru:
    $ http POST 10.0.4.62:2000/token IAM-User-ID:<your-iam-user-id> --unsorted

    Пожалуйста, не забывайте выходить из этого терминала командой exit.

  1. Скопировать токен из этого терминала невозможно, но можно посмотреть имя json-файла в поле obs_key и скачать файл из бакета ОАИТ, папка gigachat-token:
  1. В файле находится тот же ответ, который вы видите в терминале:
    {
        "token":"eyJjdHkiOiJqd3QiLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIiwiYWxnIjoiUlNBLU9BRVAtMjU2In0.pbjbXfRGIBH0MBMV2Dw4dhPJUpTT3WmWBPhWSGuOvcOwTArlw4NI95pfi8L1k-MfOJf4a1rFbLC_BXcjbjBUn7mAFaTsujpQn5bzEpQCSHH3TYXr3Y8g2TNy14RtzbVPuChOxZcY4iMCwfq2GWSiwOYCstztd1TEthK4nkNkk5b18te0YnSLsTAHs7-DYzf8dqMq3OP4BhfCs9eZ8oWAYZ3XiqomYTStb6SBC_3KZGxdy6L9Dc3pYlQqUUSNhg4us9te4zkPeAA15DrYASuAA1GKGgjfC9zGwdrPJD7upRLisExCmfGLkJk-8WEWcFlhqk_1sc8cxJdIOwOrJBNf-g.nx7Zjqz3enUVaKBVtgmwZg.5Eey_-IO7AAG98onE04h-K-7UodDp1o__08FweS3BAbWHATFbgSVGi8lhGVskimoRr5NfDuNQ7EOWIHxE3dkPj94LWGc4hBVSX0HZSiJOvuAuoUqRz5TzRvCQWBJyJCxyhUjA3YHIn1eBxW4a9G1_fJPMDYn-myiAgvnIO2ilnOzEUFtVi2Lb4ims9E9dTpI-hh6nDtn0XuSSUrpGWxxGKpLzbcbzQrooHybAT8ZXtVf7_j83tUvqEv5M0ZoS-NmoQDCyD4ODOdGNB4k8j0K96fY6lm9ToyFZLct8jkmsbfXUMAgo1acNcinvt-2JvoBciYU8YnyPRS3ESnYI73oG0QLy8XmCiGw0rNhzH1ni1mYJUV22861xIa5L23BBczHcebj3wmPJh7aTZNbNtfTp3kQuzmRP0vgFhh6Q_wHZScVsB0nuAhsank6Lgwb8nfCKA5dYMcS5SmlRUfZzDl0SO7PFJTj0bZILF6FQCblwfdHAdE_nc5hS_r67w-7-pKotnyluYVb9xE_5Y7-AU4dl1eywa__Kvu2ggJqe33mfpmqAtiwvH4pMzn2q61BteJZ39MtxNHEkxGprpYXCsEJRM2zUSGZvdFHC_zaTiaeaMu_yukcxAtDP7lHBg1eIcTLGKSVslSHjNm6Dd_MjBSijw3vycOJZ8a91_KjkF7T5EC0kY996Iwl6pK8fx33bU1w6kg7eDGsdTEEbg9dz8rL_NdwMphXdaCY4MjCMszk_uI.O53HMoq5Fqo0ERtyowFLfGImiAdCO05bu70iPHp9Hg0",
        "minutes_valid":30,
        "released":"2025-11-28T10:40:53+03:00",
        "expires":"2025-11-28T11:10:53+03:00",
        "obs_key":"gigachat-token/e5eb576a-1641-43de-a110-b85bea4ce141.json"
    }

Проброс порта (port forwarding / SSH-tunneling)

Приложение для выпуска токенов доступно внутри Облака УВА и недоступно из интернета. Однако можно пробросить локальный порт, и весь трафик, идущий на него, будет перенаправляться в приложение:

$ ssh -L 2000:10.0.4.62:2000 <your-username>@<ECS-external-IP>
  • -L 2000 — произвольно выбранный локальный порт.
  • 10.0.4.62:2000 — эти данные должны остаться без изменения.
  • <your-username>@<ECS-external-IP> заполните своими данными.

Запросы, посылаемые на локальный порт 2000 (например, с помощью requests ниже), теперь перенаправляются на порт 2000 хоста 10.0.4.62 — туда, где работает приложение. И это возможно потому, что хосту <ECS-external-IP>, через который вы подключаетесь, разрешено обращаться на порт 2000 хоста 10.0.4.62 входящим правилом последнего.

После проброса порта приложение будет доступно локально:

response = requests.post(
    url="http://localhost:2000/token",  # -L 2000
    headers={"IAM-User-ID": "<your-iam-user-id>"}
)

Также будет доступен Swagger на http://localhost:2000/ или http://localhost:2000/docs:

Пример переиспользования токена доступа

from langchain_gigachat.chat_models import GigaChat
from pydantic import create_model
from rich import print

from enums import GigaChatAPIScope, GigaChatModel, TimezoneKey
from models import GigaChatSettings
from tools import GigaChatTokenReleaser


token_releaser = GigaChatTokenReleaser(
    timezone_key=TimezoneKey.ETC_GMT_3,  # Moscow
    over_ssh_tunnel=True
)

prompt = "Составь меню русской кухни"
fields = ["breakfast", "dinner", "supper"]
structured_output = None
default_settings = GigaChatSettings().model_dump()

Template = create_model(
    "Template",
    __doc__=prompt,
    **dict.fromkeys(fields, str)
)

# продолжение фрагмента см. ниже
  1. Переименуйте .env.example в .env и заполните переменные окружения своими значениями:
    IAM_USER_ID=
    TUNNEL_TARGET_PORT=2000  # -L 2000
    TOKEN_RELEASER_URL=http://10.0.4.62:2000/token
  1. Для этого митапа я сделал несколько простых вспомогательных классов, которые вы можете использовать в своей работе. В частности, класс GigaChatTokenReleaser.
    Выше я сказал, что если вы планируете встраивать автоматический выпуск токенов в свой сервис, мы просим вас подходить разумно и выпускать новый токен после истечения срока действия предыдущего. Класс GigaChatTokenReleaser это и реализует. При инициализации объекта класса выпускается токен и кэшируется. Объект релизера является вызываемыем (callable), который при вызове:
    • проверяет, не истек ли срок действия кэшированного токена, и если истек, то запрашивает выпуск нового, который заменяет в кэше просроченный;
    • возвращает значение токена.

    При инициализации релизера нужно указать 2 параметра:

    • часовой пояс timezone_key, который необходим, чтобы релизер проверял срок годности кэшированного токена. Для удобства пользователя валидные часовые пояса реализованы как строковое перечисление TimezoneKey, в котором Калининград находится в TimezoneKey.ETC_GMT_2, Москва и Петербург — в TimezoneKey.ETC_GMT_3, а Владивосток — в TimezoneKey.ETC_GMT_10. Если вы затрудняетесь с определением своего часового пояса:

      Соответственно, для Иркутска нужно выбрать TimezoneKey.ETC_GMT_8. Интересующиеся могут изучить модуль zoneinfo стандартной библиотеки. В частности, функцию zoneinfo.available_timezones.

    • булевый параметр over_ssh_tunnel. Если вы выбрали True, это означает, что вы уже сделали проброс локального порта, указанного в переменной окружения TUNNEL_TARGET_PORT, и релизер будет ходить в приложение через локалхост. Если вы оставляете значение по умолчанию, False, то это предполагает, что ваш код работает на виртуальной машине, и релизер будет ходить за новым токеном в TOKEN_RELEASER_URL=http://10.0.4.62:2000/token.
  1. Чтобы пример был чуть интереснее, дадим гигачату задание со структурированным выводом. Мы говорим Составь меню русской кухни и хотим, чтобы в ответе были поля завтрак, обед и ужин. С помощью функции pydantic.create_model мы динамически создаем модель-шаблон ответа из указанных полей, значения которых будут строковыми. Чтобы гигачат мог выполнить структурированный вывод, важно у шаблона заполнить docstring. Для этого можно переиспользовать промпт.
  1. На описании pydantic-модели GigaChatSettings и строковых перечислений GigaChatAPIScope и GigaChatModel я сейчас останавливаться не буду, посмотрите код самостоятельно. Они выполняют предварительную валидацию пользовательского ввода. Предварительную в том смысле, что до того, как это сделает гигачат. Далее я поясню, почему это полезно.
  1. Итак, мы инициализируем гигачат, передавая токен доступа с помощью релизера, и просим составить меню, придерживаясь структуры шаблона.
    # начало фрагмента см. выше
    
    while not isinstance(structured_output, Template):
        gigachat = GigaChat(
            access_token=token_releaser(),
            scope=GigaChatAPIScope.CORP,
            model=GigaChatModel.GIGACHAT2_PRO,
            verify_ssl_certs=False,
            **default_settings
        )
        
        # GigaChat re-init, timeit -n 100_000
        # 56.1 μs ± 470 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)
    
        # token_releaser.n_tokens_released
        # 1
    
        gigachat = gigachat.with_structured_output(Template)
        structured_output = gigachat.invoke(prompt)
    
    print(structured_output.model_dump())
    
    # Пример ответа:
    # {
    #     'breakfast': 'Омлет с зеленью, блины с вареньем, чай с лимоном',
    #     'dinner': 'Щи из свежей капусты, пельмени с сметаной, компот из сухофруктов',
    #     'supper': 'Картофельное пюре, котлеты с грибным соусом, кефир'
    # }
  1. Теперь я поясню, для чего здесь цикл. Это важный момент, я прошу вас обратить внимание.
    В данный момент пользователям Облака УВА доступны 10 потоков в GigaChat API. Это означает, что 10 одновременных запросов будут обслуживаться гигачатом параллельно, независимо друг от друга. Но 10 потоков для Облака УВА сейчас это дорого, бюджет согласован на один. Через какое-то время, — вероятно, в начале 2026 г., — мы сделаем даунгрейд до одного потока.
    Временные токены выпускаются одним авторизационным ключом. Количество доступных потоков гигачата привязано к авторизационному ключу. Соответственно, временные токены, выпущенные одним ключом-эмитентом, делят между собой потоки гигачата, доступные ключу. Другими словами, дети-токены пользуются общим пулом потоков гигачата родительского ключа.
    Следовательно, однопоточность гигачата означает, что если в момент обработки запроса от одного токена гигачату придет другой, второй, запрос — от этого же токена или от другого, но выпущенного тем же ключом, — то второй получит в ответ ошибку 429: Too many requests.
    Здесь подходит аналогия со звонками в многоканальный call-центр. Когда вы звоните и не попадаете сразу на оператора, то возможны 2 варианта. Первый: вас ставят в очередь ожидания. Второй: вас сбрасывают, предлагая тем самым повторить попытку.
    Вот однопоточный гигачат это как раз второй случай. Поэтому в коде необходимо предусмотреть механизм повторной отправки запроса. В нашем примере со структурированным выводом критерий успешной обработки запроса — и, соответственно, прерывания цикла, — это получение в ответ объекта класса Template: получили, что требовали, — выходим из цикла, не получили — продолжаем запросы. Если вы разрабатываете сервис, изучите документацию GigaChain, чтобы правильно сформулировать терминальный критерий именно для вашего случая.
    Также я сказал выше, что вы поймете, почему полезно делать предварительную валидацию данных — до того, как в игру вступает гигачат. Потому что при однопоточной архитектуре вам важно получить результат, если удалось пробиться. Представьте, что вы с трудом прошли на какое-то мероприятие, но внутри оказалось, что “в шортах нельзя”. Дресс-код, или протокол, в общем случае, полезно знать заранее. Полезно знать типы и диапазоны значений ваших данных, чтобы устранить несоответствия до того как ваш запрос заполучит ценный ресурс — освободившийся поток гигачата.
  1. Несколько слов о реинициализации GigaChat в цикле, которая может показаться нерациональной. На самом деле инициализация объекта класса GigaChat вычислительно почти бесплатная, потому что валидация данных (например, температуры, top_p и т.д.) и реальная работа начинаются только при вызове методов — например, invoke. Замер времени инициализации GigaChat дает величину порядка “десять в минус шестой”: для 700 тыс. инициализаций среднее составило ок. 56 мкс, что очень мало на фоне секунд, необходимых на полный цикл обработки гигачатом вашего запроса.
    Заодно обратите, пожалуйста, внимание, что у релизера токенов есть атрибут n_tokens_released — счетчик числа выпущенных токенов — и за 700 тыс. итераций его значение так и осталось единицей. Вот об этом я и все мы, команда кураторов Облака УВА, вас и просим: многократно переиспользуйте в своем коде выпущенный токен, если срок его годности еще не истек.

Итератор текстовых чанков GigaChunker

Если нужно обработать большой текст, который целиком не поместится в контекст гигачата, можно использовать итератор текстовых чанков GigaChunker.

Чанки кратны предложению на языке текста и максимально полно осваивают 128-тысячный контекст гигачата. Максимально полно с той оговоркой, что чанк набирается не из отдельных предложений, что было бы очень долго, а из более крупных фрагментов, но кратно предложению.

Язык текста определяется автоматически. В примере используется роман “Война и мир”, для которого требуется 8 контекстов гигачата.

import json

from docx2python import docx2python
from gigachat import GigaChat

from enums import GigaChatAPIScope, GigaChatModel, TimezoneKey
from tools import GigaChatTokenReleaser, GigaChunker


token_releaser = GigaChatTokenReleaser(
    timezone_key=TimezoneKey.ETC_GMT_3,
    over_ssh_tunnel=True
)

giga = GigaChat(
    access_token=token_releaser(),
    scope=GigaChatAPIScope.CORP,
    model=GigaChatModel.GIGACHAT2_MAX,
    verify_ssl_certs=False
)

text = docx2python("war_and_peace.docx").text
chunker = GigaChunker(giga, text)

assert hasattr(chunker, "__iter__")
assert hasattr(chunker, "__next__")


def chunk_info(number: int, chunk: str) -> dict[str, str | int]:
    end = chunk.find(".", 500) + 1
    return {
        "chunk_n": number,
        "chunk_full_length": len(chunk),
        "starting_excerpt": chunk[:end]
    }


chunks_info = [chunk_info(*nobj) for nobj in enumerate(chunker, 1)]

with open("chunks_info.json", "w", encoding="utf-8") as fp:
    json.dump(chunks_info, fp, ensure_ascii=False, indent=4)
[
    {
        "chunk_n": 1,
        "chunk_full_length": 465212,
        "starting_excerpt": "-- Лев Николаевич Толстой Война и мир Государственное издательство «Художественная литература» Москва, 1937—1940 Электронное издание осуществлено в рамках краудсорсингового проекта <a href=\"http://www.readingtolstoy.ru/\">«Весь Толстой в один клик»</a> Организаторы: <a href=\"http://tolstoymuseum.ru/\">Государственный музей Л.Н. Толстого</a> <a href=\"http://ypmuseum.ru/\">Музей-усадьба «Ясная Поляна»</a> <a href=\"http://www.abbyy.ru/\">Компания ABBYY</a> Подготовлено на основе электронных копий томов 9–12 Полного собрания сочинений Л."
    },
    {
        "chunk_n": 2,
        "chunk_full_length": 477085,
        "starting_excerpt": "Из-за детской радости, возбужденной пожаром, и азарта удачной стрельбы по французам, наши артиллеристы заметили эту батарею только тогда, когда два ядра и вслед за ними еще четыре ударили между орудиями и одно повалило двух лошадей, а другое оторвало ногу ящичному вожатому. Оживление, раз установившееся, однако, не ослабело, а только переменило настроение. Лошади были заменены другими из запасного лафета, раненые убраны, и четыре орудия повернуты против десятипушечной батареи. Офицер, товарищ Тушина, был убит в начале дела, и в продолжение часа из сорока человек прислуги выбыли семнадцать, но артиллеристы всё так же были веселы и оживлены."
    },
    {
        "chunk_n": 3,
        "chunk_full_length": 476168,
        "starting_excerpt": "— Да мы знаем, но то зло, которое я знаю для себя, я не могу сделать другому человеку, — всё более и более оживляясь говорил князь Андрей, видимо желая высказать Пьеру свой новый взгляд на вещи. Он говорил по-французски. Je ne connais dans la vie que maux bien réels: c’est le remord et la maladie. Il n’est de bien que l’absence de ces maux.1 Жить для себя, избегая только этих двух зол: вот вся моя мудрость теперь. — А любовь к ближнему, а самопожертвование? — заговорил Пьер. — Нет, я с вами не могу согласиться! Жить только так, чтобы не делать зла, чтоб не раскаиваться, этого мало."
    },
    {
        "chunk_n": 4,
        "chunk_full_length": 485732,
        "starting_excerpt": "Потом он писал, что знает про то, что родные ее не отдадут ее ему, Анатолю, что на это есть тайные причины, которые он ей одной может открыть, но что ежели она его любит, то ей стоит сказать это слово да, и никакие силы людские не помешают их блаженству. Любовь победит всё. Он похитит и увезет ее на край света. «Да, да, я люблю его!» думала Наташа, перечитывая 345 в двадцатый раз письмо и отыскивая какой-то особенный глубокий смысл в каждом его слове. В этот вечер Марья Дмитриевна ехала к Архаровым и предложила барышням ехать с нею."
    },
    {
        "chunk_n": 5,
        "chunk_full_length": 475956,
        "starting_excerpt": "А то мы играли в войну, — вот чтó скверно, мы великодушничаем и т. п. Это великодушничанье и чувствительность — в роде великодушия и чувствительности барыни, с которою делается дурнота, когда она видит убиваемого теленка; она так добра, что не может видеть кровь, но она с аппетитом кушает этого теленка под соусом. Нам толкуют о правах войны, о рыцарстве, о парламентерстве, щадить несчастных и т. д. Всё вздор. Я видел в 1805-м году рыцарство, парламентерство; нас надули, мы надули. Грабят чужие дома, пускают фальшивые ассигнации, да хуже всего, убивают моих детей, моего отца и говорят о правилах войны и великодушии к врагам."
    },
    {
        "chunk_n": 6,
        "chunk_full_length": 496393,
        "starting_excerpt": "Его привели к построенным 1 Это научит, их поджигать, 43 вверху поля из обгорелых досок, бревен и тесу, балаганам, и ввели в один из них. В темноте человек двадцать различных людей окружили Пьера. Пьер смотрел на них, не понимая, кто такие эти люди, зачем они и чего хотят от него. Он слышал слова, которые ему говорили, но не делал из них никакого вывода и приложения: не понимал их значения. Он сам отвечал на то, что у него спрашивали, но не соображал того, кто слушает его, и как поймут его ответы."
    },
    {
        "chunk_n": 7,
        "chunk_full_length": 396479,
        "starting_excerpt": "Он гордился тем, что она так умна, и хорошо сознавал свое ничтожество перед нею в мире духовном, и тем более радовался тому, что она с своею душой не только принадлежала ему, но составляла часть его самого. — Очень и очень одобряю, мой друг, — сказал он, с значительным видом. И, помолчав немного, он прибавил: — а я нынче скверно себя вел. Тебя не было в кабинете. Мы заспорили с Пьером, и я погорячился. Да невозможно. Это такой ребенок. Я не знаю, что̀ бы с ним было, ежели бы Наташа не держала его 287 под уздцы."
    },
    {
        "chunk_n": 8,
        "chunk_full_length": 325413,
        "starting_excerpt": "Вместо: в нем — в I и II изд. 68 г.: на нем Стр. 228, строка 22. Вместо: XXIV. — в изд. 73 г.: LXI. Ч. III, гл. XXIV. Стр. 230, строка 6. Вместо: «Чтò он — в I изд. 68 г.: «Чего он Стр. 230, строка 14. После слов: не пугала ее. — в I изд. 68 г.: так как и он бледнел и холодел при одной мысли о том. 399 Стр. 231, строка 13. Вместо: физиономией, — в I и II изд. 68 г.: физиогномией Стр. 231, строка 15. Вместо: XXV. — в изд. 73 г.: LXII. Ч. III, гл. XXV. Стр. 231, строка 33. Вместо: мог бы он быть — в I изд."
    }
]

Благодарности

За добытый авторизационный ключ гигачата, с помощью которого приложение создает временные токены, пожалуйста, направляйте благодарности и лучи добра Абрамчуку Илье.

Тиражирование

Если у вас тоже есть авторизационный ключ гигачата и вы хотите запустить аналогичное приложение для выпуска временных токенов (для всех или только для коллег по своей вертикали — неважно), обращайтесь, пожалуйста, в ОАИТ Северо-Западного банка.

rss2db

  1. Описание проекта
  1. См. rss2db_example.ipynb в репозитории с примерами