Отправить асинхронный запрос

Запросы к собственным моделям Яндекса можно отправлять в асинхронном режиме. В ответ на асинхронный запрос модель вернет объект Operation, содержащий идентификатор операции, по которому можно отследить ее выполнение и получить результат после того, как генерация завершится. Этот режим подходит, если ваши задачи не требуют срочного ответа, поскольку асинхронные запросы выполняются дольше, чем синхронные.

Перед началом работы

Чтобы воспользоваться примерами запросов с использованием SDK:

  1. Создайте сервисный аккаунт и назначьте ему роль ai.languageModels.user.
  2. Получите и сохраните API-ключ сервисного аккаунта, указав для него область действия yc.ai.foundationModels.execute.

    В примерах используется аутентификация с помощью API-ключа. Yandex AI Studio SDK также поддерживает аутентификацию с помощью IAM-токена и OAuth-токена. Подробнее см. в разделе Аутентификация в Yandex AI Studio SDK.

    Примечание

    Если вы используете ОС Windows, рекомендуем предварительно установить оболочку WSL и выполнять дальнейшие действия в этой оболочке.

  3. Установите Python версии 3.10 или выше.

  4. (Опционально) Установите библиотеку Python venv для создания изолированных виртуальных окружений в Python.

  5. (Опционально) Создайте и войдите в новое виртуальное окружение Python:

    python3 -m venv new-env
            source new-env/bin/activate
            
  6. С помощью менеджера пакетов pip установите библиотеку AI SDK:

    pip install yandex-ai-studio-sdk
            

Получите данные для аутентификации в API, как описано в разделе Аутентификация в API Yandex AI Studio.

Чтобы воспользоваться примерами, установите cURL.

Отправьте запрос к модели

При использовании Yandex AI Studio SDK ваш код может дождаться завершения выполнения операции и получения ответа. Для этого можно использовать либо функцию sleep модуля time, либо метод wait. В приведенном примере последовательно используются оба эти способа.

  1. Создайте файл generate-deferred.py и добавьте в него следующий код:

    #!/usr/bin/env python3
            
            from __future__ import annotations
            import time
            from yandex_ai_studio_sdk import AIStudio
            
            messages_1 = [
                {
                    "role": "system",
                    "text": "Найди ошибки в тексте и исправь их",
                },
                {
                    "role": "user",
                    "text": """Ламинат подойдет для укладке на кухне или в детской 
            комнате – он не боиться влаги и механических повреждений благодаря 
            защитному слою из облицованных меламиновых пленок толщиной 0,2 мм и 
            обработанным воском замкам.""",
                },
            ]
            
            messages_2 = [
                {"role": "system", "text": "Найди ошибки в тексте и исправь их"},
                {"role": "user", "text": "Ашипки саме сибя ни исрпвят."},
            ]
            
            
            def main():
            
                sdk = AIStudio(
                    folder_id="<идентификатор_каталога>",
                    auth="<API-ключ>",
                )
            
                model = sdk.models.completions("yandexgpt")
            
                # Variant 1: wait for the operation to complete using 5-second sleep periods
            
                print("Variant 1:")
            
                operation = model.configure(temperature=0.5).run_deferred(messages_1)
            
                status = operation.get_status()
                while status.is_running:
                    time.sleep(5)
                    status = operation.get_status()
            
                result = operation.get_result()
                print(result)
            
                # Variant 2: wait for the operation to complete using the wait method
            
                print("Variant 2:")
            
                operation = model.run_deferred(messages_2)
            
                result = operation.wait()
                print(result)
            
            
            if __name__ == "__main__":
                main()
            

    Где:

    Примечание

    В качестве входных данных для запроса Yandex AI Studio SDK может принимать строку, словарь, объект класса TextMessage или массив, содержащий любое сочетание указанных типов данных. Подробнее см. в разделе Использование Yandex AI Studio SDK.

    • messages_1 и messages_2 — массивы сообщений, которые задают контекст для модели и используются для разных способов получения результата выполнения асинхронного запроса:

      • role — роль отправителя сообщения:

        • user — предназначена для отправки пользовательских сообщений к модели.
        • system — позволяет задать контекст запроса и определить поведение модели.
        • assistant — используется для ответов, которые генерирует модель. При работе в режиме чата ответы модели, помеченные ролью assistant, включаются в состав сообщения для сохранения контекста беседы. Не передавайте сообщения пользователя с этой ролью.
    • text — текстовое содержимое сообщения.

    Подробнее о том, как обращаться к определенной версии модели, см. в разделе {#T}.

  2. Выполните созданный файл:

    python3 generate-deferred.py
            

    Результат:

    Variant 1:
            GPTModelResult(alternatives=(Alternative(role='assistant', text='Ламинат подойдет для укладки на кухне или в детской комнате – он не боится влаги и механических повреждений благодаря защитному слою из облицованных меламиновых пленок толщиной 0,2 мм и обработанным воском замкам.', status=<AlternativeStatus.FINAL: 3>),), usage=Usage(input_text_tokens=74, completion_tokens=46, total_tokens=120), model_version='23.10.2024')
            Variant 2:
            GPTModelResult(alternatives=(Alternative(role='assistant', text='Ошибки сами себя не исправят.\n\nАшипки → ошибки.', status=<AlternativeStatus.FINAL: 3>),), usage=Usage(input_text_tokens=32, completion_tokens=16, total_tokens=48), model_version='23.10.2024')
            

    Код дожидается получения результата сначала для первого способа, затем — для второго.

Чтобы воспользоваться примерами, установите cURL.

Пример ниже разработан для выполнения в операционных системах MacOS и Linux. Чтобы выполнить его в системе Windows, ознакомьтесь с особенностями работы с Bash в Microsoft Windows.

  1. Создайте файл с телом запроса (например, body.json):

    {
              "modelUri": "gpt://<идентификатор_каталога>/yandexgpt",
              "completionOptions": {
                "stream": false,
                "temperature": 0.1,
                "maxTokens": "2000",
                "reasoningOptions": {
                  "mode": "DISABLED"
                }
              },
              "messages": [
                {
                  "role": "system",
                  "text": "Переведи текст"
                },
                {
                  "role": "user",
                  "text": "To be, or not to be: that is the question."
                }
              ]
            }
            
    • modelUriидентификатор модели, которая будет использоваться для генерации ответа. Параметр содержит идентификатор каталога Yandex Cloud или идентификатор дообученной модели.

    • completionOptions — параметры конфигурации запроса:

      • stream — включает потоковую передачу частично сгенерированного текста. Принимает значения true или false.

      • temperature — чем выше значение этого параметра, тем более креативными и случайными будут ответы модели. Принимает значения от 0 (включительно) до 1 (включительно). Значение по умолчанию: 0.3.

      • maxTokens — устанавливает ограничение на выход модели в токенах. Максимальное число токенов генерации зависит от модели. Подробнее см. в разделе Квоты и лимиты в Yandex AI Studio.

      • reasoningOptions.mode — параметры режима рассуждений. Необязательный параметр. Значение по умолчанию — DISABLED. Возможные значения:

        • DISABLED — режим рассуждений выключен.
        • ENABLED_HIDDEN — режим рассуждений включен. При этом модель самостоятельно принимает решение о необходимости использования этого режима для каждого конкретного запроса.
    • messages — массив сообщений, которые задают контекст для модели:

      • role — роль отправителя сообщения:

        • user — предназначена для отправки пользовательских сообщений к модели.
        • system — позволяет задать контекст запроса и определить поведение модели.
        • assistant — используется для ответов, которые генерирует модель. При работе в режиме чата ответы модели, помеченные ролью assistant, включаются в состав сообщения для сохранения контекста беседы. Не передавайте сообщения пользователя с этой ролью.
      • text — текстовое содержимое сообщения.

  2. Отправьте запрос к модели, выполнив команду:

    export FOLDER_ID=<идентификатор_каталога>
            export IAM_TOKEN=<IAM-токен>
            curl \
              --request POST \
              --header "Content-Type: application/json" \
              --header "Authorization: Bearer ${IAM_TOKEN}" \
              --header "x-folder-id: ${FOLDER_ID}" \
              --data "@<путь_до_файла_json>" \
              "https://ai.api.cloud.yandex.net/foundationModels/v1/completionAsync"
            

    Где:

    • FOLDER_ID— идентификатор каталога, на который у вашего аккаунта есть роль ai.languageModels.user или выше.
    • IAM_TOKEN — IAM-токен, полученный перед началом работы.

    В ответе сервис вернет объект Operation:

    {
              "id": "d7qi6shlbvo5********",
              "description": "Async GPT Completion",
              "createdAt": "2023-11-30T18:31:32Z",
              "createdBy": "aje2stn6id9k********",
              "modifiedAt": "2023-11-30T18:31:33Z",
              "done": false,
              "metadata": null
            }
            

    Сохраните идентификатор (id) операции, полученный в ответе.

  3. Отправьте запрос на получение результата операции:

    curl \
              --request GET \
              --header "Authorization: Bearer ${IAM_TOKEN}" \
              https://operation.api.cloud.yandex.net/operations/<ID_операции>
            

    Пример результата:

    {
              "done": true,
              "response": {
                "@type": "type.googleapis.com/yandex.cloud.ai.foundation_models.v1.CompletionResponse",
                "alternatives": [
                  {
                    "message": {
                      "role": "assistant",
                      "text": "Быть или не быть: вот в чем вопрос."
                    },
                    "status": "ALTERNATIVE_STATUS_FINAL"
                  }
                ],
                "usage": {
                  "inputTextTokens": "31",
                  "completionTokens": "10",
                  "totalTokens": "41"
                },
                "modelVersion": "18.01.2024"
              },
              "id": "d7qo21o5fj1u********",
              "description": "Async GPT Completion",
              "createdAt": "2024-05-12T18:46:54Z",
              "createdBy": "ajes08feato8********",
              "modifiedAt": "2024-05-12T18:46:55Z"
            }
            

См. также