Yandex Cloud
Поиск
Связаться с намиПодключиться
  • Истории успеха
  • Документация
  • Блог
  • Все сервисы
  • Статус работы сервисов
    • Популярные
    • Инфраструктура и сеть
    • Платформа данных
    • Контейнеры
    • Инструменты разработчика
    • Бессерверные вычисления
    • Безопасность
    • Мониторинг и управление ресурсами
    • ИИ для бизнеса
    • Бизнес-инструменты
  • Все решения
    • По отраслям
    • По типу задач
    • Экономика платформы
    • Безопасность
    • Техническая поддержка
    • Каталог партнёров
    • Обучение и сертификация
    • Облако для стартапов
    • Облако для крупного бизнеса
    • Центр технологий для общества
    • Облако для интеграторов
    • Поддержка IT-бизнеса
    • Облако для фрилансеров
    • Обучение и сертификация
    • Блог
    • Документация
    • Контент-программа
    • Мероприятия и вебинары
    • Контакты, чаты и сообщества
    • Идеи
    • Калькулятор цен
    • Тарифы
    • Промоакции и free tier
    • Правила тарификации
  • Истории успеха
  • Документация
  • Блог
Проект Яндекса
© 2025 ООО «Яндекс.Облако»
Yandex AI Studio
  • Начало работы с Model Gallery
    • О сервисе Yandex AI Studio
    • Yandex Workflows
    • Квоты и лимиты
    • Термины и определения
  • Переход с AI Assistant API на Responses API
  • Совместимость с OpenAI
    • Все руководства
    • Реализация AI-ассистента с поиском по PDF-файлам со сложным форматированием
    • Дообучение моделей в DataSphere
    • Создание AI-агента с помощью Yandex Cloud Functions
    • Интеграция генеративных моделей в Visual Studio Code
    • Создание интеллектуального ассистента для Telegram
    • Разработка Telegram-бота с поддержкой AI-агента с помощью Yandex Workflows
    • ИИ-ревью пул-реквестов на GitHub с помощью Yandex Workflows и GitHub Actions
  • Управление доступом
  • Правила тарификации
  • Аудитные логи Audit Trails
  • Публичные материалы
  • История изменений

В этой статье:

  • Перед началом работы
  • Необходимые платные ресурсы
  • Зарегистрируйте Telegram-бота
  • Создайте секрет
  • Создайте бакет
  • Создайте сервисные аккаунты
  • Настройте рабочий процесс
  • Подготовьте YaWL-спецификацию
  • Создайте рабочий процесс
  • Настройте API-шлюз
  • Подготовьте спецификацию API
  • Создайте API-шлюз
  • Настройте вебхук для бота
  • Проверьте работу бота
  • Как удалить созданные ресурсы
  1. Практические руководства
  2. Разработка Telegram-бота с поддержкой AI-агента с помощью Yandex Workflows

Как создать бота в Telegram с поддержкой AI-агента с помощью Yandex Workflows

Статья создана
Yandex Cloud
Улучшена
Обновлена 13 октября 2025 г.
  • Перед началом работы
  • Необходимые платные ресурсы
  • Зарегистрируйте Telegram-бота
  • Создайте секрет
  • Создайте бакет
  • Создайте сервисные аккаунты
  • Настройте рабочий процесс
    • Подготовьте YaWL-спецификацию
    • Создайте рабочий процесс
  • Настройте API-шлюз
    • Подготовьте спецификацию API
    • Создайте API-шлюз
  • Настройте вебхук для бота
  • Проверьте работу бота
  • Как удалить созданные ресурсы

С помощью serverless-технологий можно создать бота для Telegram с поддержкой модели генерации текста на базе сервиса Yandex AI Studio.

В этом руководстве вы создадите бота для подбора фильмов на основании предпочтений пользователя. Для этого вы организуете хранение данных в Yandex Object Storage и Yandex Lockbox, настроите логику бота в Yandex Workflows и вебхук с помощью Yandex API Gateway.

Чтобы создать бота:

  1. Подготовьте облако к работе.
  2. Зарегистрируйте Telegram-бота.
  3. Создайте секрет.
  4. Создайте бакет.
  5. Создайте сервисные аккаунты.
  6. Настройте рабочий процесс.
  7. Настройте API-шлюз.
  8. Настройте вебхук для бота.
  9. Проверьте работу бота.
  10. Настройте агент под вашу задачу.

Если созданные ресурсы вам больше не нужны, удалите их.

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

Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:

  1. Перейдите в консоль управления, затем войдите в Yandex Cloud или зарегистрируйтесь.
  2. На странице Yandex Cloud Billing убедитесь, что у вас подключен платежный аккаунт, и он находится в статусе ACTIVE или TRIAL_ACTIVE. Если платежного аккаунта нет, создайте его и привяжите к нему облако.

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

Подробнее об облаках и каталогах.

Необходимые платные ресурсыНеобходимые платные ресурсы

В стоимость поддержки Telegram-бота входят:

  • плата за генерацию текста (см. тарифы Yandex AI Studio);
  • плата за хранение секрета и запросы к нему (см. тарифы Yandex Lockbox);
  • плата за объем хранилища, занятый данными, количество операций с данными и исходящий трафик (см. тарифы Yandex Object Storage);
  • плата за количество запросов к созданному API-шлюзу и исходящий трафик (см. тарифы Yandex API Gateway);
  • плата за получение и хранение логов (см. тарифы Yandex Cloud Logging).

Зарегистрируйте Telegram-ботаЗарегистрируйте Telegram-бота

Зарегистрируйте вашего бота в Telegram и получите токен.

  1. Для регистрации нового бота запустите бота BotFather и отправьте команду:

    /newbot
    
  2. Укажите имя создаваемого бота, например Serverless AI Telegram Bot. Это имя увидят пользователи при общении с ботом.

  3. Укажите имя пользователя создаваемого бота, например ServerlessAITelegramBot. По имени пользователя можно будет найти бота в Telegram. Имя пользователя должно оканчиваться на ...Bot или ..._bot.

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

Создайте секретСоздайте секрет

Создайте секрет, в котором будет храниться токен для доступа к API Telegram.

Консоль управления
Yandex Cloud CLI
API
  1. В консоли управления выберите каталог, в котором вы будете создавать инфраструктуру.
  2. Выберите сервис Lockbox.
  3. Нажмите Создать секрет.
  4. В поле Имя введите имя секрета.
  5. Выберите тип секрета Пользовательский.
  6. В поле Ключ введите token.
  7. В поле Значение укажите токен бота, полученный при его создании.
  8. Нажмите Создать.

Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), установите и инициализируйте его.

По умолчанию используется каталог, указанный при создании профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду yc config set folder-id <идентификатор_каталога>. Также для любой команды вы можете указать другой каталог с помощью параметров --folder-name или --folder-id.

  1. Посмотрите описание команды CLI для создания секрета:

    yc lockbox secret create --help
    
  2. Создайте секрет:

    yc lockbox secret create \
      --name tg-bot-token \
      --payload '[{"key":"token","text_value":"<токен_бота>"}]'
    

    Где:

    • --name — имя секрета.

    • --payload — содержимое секрета в виде массива формата YAML или JSON:

      • key — ключ секрета.
      • text_value — значение секрета. Укажите токен, полученный при создании бота.

    Результат:

    id: e6qf05v4ftms********
    folder_id: b1g681qpemb4********
    created_at: "2025-08-20T12:26:02.961Z"
    name: tg-bot-token
    status: ACTIVE
    current_version:
      id: e6q768pl3vrf********
      secret_id: e6qf05v4ftms********
      created_at: "2025-08-20T12:26:02.961Z"
      status: ACTIVE
      payload_entry_keys:
        - token
    

Чтобы создать секрет, воспользуйтесь методом REST API Create для ресурса Secret или вызовом gRPC API SecretService/Create.

Создайте бакетСоздайте бакет

Создайте бакет для хранения истории чата с ботом.

Консоль управления
Yandex Cloud CLI
AWS CLI
API
  1. В консоли управления выберите сервис Object Storage.
  2. На панели сверху нажмите Создать бакет.
  3. Введите имя бакета в соответствии с правилами именования.
  4. Укажите максимальный размер бакета 5 ГБ.
  5. Нажмите Создать бакет.
  1. Посмотрите описание команды CLI для создания бакета:

    yc storage bucket create --help
    
  2. Создайте бакет в каталоге по умолчанию:

    yc storage bucket create \
      --name <имя_бакета> \
      --default-storage-class standard \
      --max-size 5368709120
    

    Где:

    • --name — имя бакета в соответствии с правилами именования.
    • --default-storage-class — класс хранилища.
    • --max-size — максимальный размер бакета в байтах.

    Результат:

    name: bot-history-storage
    folder_id: b1g681qpemb4********
    anonymous_access_flags: {}
    default_storage_class: STANDARD
    versioning: VERSIONING_DISABLED
    max_size: "5368709120"
    created_at: "2025-08-20T12:23:21.361186Z"
    resource_id: e3erbgk1qmih********
    

Если у вас еще нет интерфейса командной строки AWS CLI, установите и сконфигурируйте его.

Чтобы создать бакет, назначьте сервисному аккаунту, через который работает AWS CLI, роль storage.editor.

В терминале выполните команду:

aws s3api create-bucket \
  --endpoint-url=https://storage.yandexcloud.net \
  --bucket <имя_бакета>

Где:

  • --endpoint-url — эндпоинт Object Storage.
  • --bucket — имя бакета в соответствии с правилами именования.

Чтобы создать бакет, воспользуйтесь методом REST API Create для ресурса Bucket, вызовом gRPC API BucketService/Create или методом S3 API create.

Создайте сервисные аккаунтыСоздайте сервисные аккаунты

Cоздайте два сервисных аккаунта:

  • sa-apigw — от его имени будет запускаться рабочий процесс Workflows;
  • sa-workflows — от его имени будут выполняться шаги рабочего процесса.
Консоль управления
Yandex Cloud CLI
API
  1. В консоли управления выберите сервис Identity and Access Management.
  2. Нажмите Создать сервисный аккаунт.
  3. Введите имя сервисного аккаунта sa-apigw.
  4. Нажмите Добавить роль и выберите роль serverless.workflows.executor.
  5. Нажмите Создать.

Аналогичным образом создайте сервисный аккаунт с именем sa-workflows и назначьте ему роли:

  • storage.uploader
  • storage.viewer
  • lockbox.payloadViewer
  • ai.languageModels.user
  1. Посмотрите описание команды CLI для создания сервисного аккаунта:

    yc iam service-account create --help
    
  2. Создайте сервисные аккаунты:

    yc iam service-account create --name sa-apigw
    yc iam service-account create --name sa-workflows
    

    Где --name — имя сервисного аккаунта.

    Результат:

    id: ajeu2s3k358j********
    folder_id: b1g681qpemb4********
    created_at: "2025-08-20T12:18:37.599632350Z"
    name: sa-apigw
    
    id: ajersnus6rb2********
    folder_id: b1g681qpemb4********
    created_at: "2025-08-20T12:18:41.869376672Z"
    name: sa-workflows
    
  3. Сохраните идентификаторы сервисных аккаунтов и идентификатор каталога в переменные:

    APIGW_SA=$(yc iam service-account get --name sa-apigw --format json | jq -r .id)
    WF_SA=$(yc iam service-account get --name sa-workflows --format json | jq -r .id)
    FOLDER_ID=$(yc config get folder-id)
    
  4. Посмотрите описание команды CLI для назначения роли на каталог:

    yc resource-manager folder add-access-binding --help
    
  5. Назначьте сервисным аккаунтам роли на каталог:

    yc resource-manager folder add-access-binding \
      --id $FOLDER_ID \
      --role serverless.workflows.executor \
      --subject serviceAccount:$APIGW_SA
    
    yc resource-manager folder add-access-binding \
      --id $FOLDER_ID \
      --role storage.uploader \
      --subject serviceAccount:$WF_SA
    
    yc resource-manager folder add-access-binding \
      --id $FOLDER_ID \
      --role storage.viewer \
      --subject serviceAccount:$WF_SA
    
    yc resource-manager folder add-access-binding \
      --id $FOLDER_ID \
      --role lockbox.payloadViewer \
      --subject serviceAccount:$WF_SA
    
    yc resource-manager folder add-access-binding \
      --id $FOLDER_ID \
      --role ai.languageModels.user \
      --subject serviceAccount:$WF_SA
    

    Где:

    • --id — идентификатор каталога.
    • --role — роль.
    • --subject — идентификатор сервисного аккаунта.

    Результат:

    effective_deltas:
      - action: ADD
        access_binding:
          role_id: serverless.workflows.executor
          subject:
            id: ajeu2s3k358j********
            type: serviceAccount
    ...
    effective_deltas:
      - action: ADD
        access_binding:
          role_id: ai.languageModels.user
          subject:
            id: ajersnus6rb2********
            type: serviceAccount
    

Создайте сервисные аккаунты:

  • sa-apigw с ролью serverless.workflows.executor.

  • sa-workflows с ролями:

    • storage.uploader
    • storage.viewer
    • lockbox.payloadViewer
    • ai.languageModels.user

Чтобы создать сервисный аккаунт, воспользуйтесь методом REST API Create для ресурса ServiceAccount или вызовом gRPC API ServiceAccountService/Create.

Чтобы назначить роль сервисному аккаунту, воспользуйтесь методом REST API updateAccessBindings для ресурса ServiceAccount или вызовом gRPC API ServiceAccountService/UpdateAccessBindings.

Настройте рабочий процессНастройте рабочий процесс

Настройте рабочий процесс, который обеспечит чтение и сохранение истории чата, вызов AI-агента и отправку ответов в Telegram.

Совет

В этом руководстве описано создание рабочего процесса с помощью YaWL-спецификации, но его также можно создать и редактировать с помощью конструктора.

telegram-ai-bot-workflows-workflow

Подготовьте YaWL-спецификациюПодготовьте YaWL-спецификацию

Сохраните YaWL-спецификацию рабочего процесса в YAML-файле, например yawl-spec.yaml:

yawl: '0.1'
start: do_work
steps:
  do_work:
    parallel:
      branches:

        # Ветка, отправляющая «typing», чтобы чат ожил быстрее
        send_typing_action:
          start: send_typing_action
          steps:
            send_typing_action:
              httpCall:
                url: >-
                  https://api.telegram.org/bot\(lockboxPayload("<идентификатор_секрета>"; "token"))/sendChatAction
                method: POST
                headers:
                  Content-Type: application/json
                body: |
                  \({
                    chat_id: .input.message.chat.id,
                    action: "typing"
                  })

        # Основная логика
        handle_update:
          start: get_history
          steps:
            get_history:
              objectStorage:
                bucket: <имя_бакета>
                object: history/\(.input.message.chat.id).json
                get:
                  contentType: JSON
                output: '\({history: .Content})'
                next: call_ai
                catch:
                  - errorList:
                      - STEP_INVALID_ARGUMENT # файла нет или не JSON -> инициализируем
                    errorListMode: INCLUDE
                    output: '\({history: []})'
                    next: call_ai

            call_ai:
              aiAgent:
                agentConfig:
                  role: Ты консультант по подбору фильмов
                  goal: >-
                    Помочь пользователю выбрать фильм по его предпочтениям.
                    При первом обращении попроси несколько любимых фильмов
                    (по одной в строке). Дальше используй их для рекомендаций
                    и задавай уточняющие вопросы.
                  backstory: >-
                    История предыдущего общения (формат JSON-массив объектов {role,message}):
                    "\(.history)"
                  model:
                    name: yandexgpt
                tasks:
                  - description: \(.input.message.text)
                    result: Ответ в Markdown для отправки в Telegram.
                output: '\({reply: .Result})'
                next: send_reply

            send_reply:
              telegramBot:
                token: \(lockboxPayload("<идентификатор_секрета>"; "token"))
                sendMessage:
                  chatId: \(.input.message.chat.id)
                  text: \(.reply)
                  replyTo: \(.input.message.message_id)
                  parseMode: MARKDOWN
                next: save_history

            save_history:
              objectStorage:
                bucket: <имя_бакета>
                object: history/\(.input.message.chat.id).json
                put:
                  contentType: JSON
                  content: >-
                    \(
                      .history +
                      [
                        {role:"user", message:.input.message.text},
                        {role:"assistant", message:.reply}
                      ]
                    )

Где:

  • <имя_бакета> — имя бакета, созданного ранее.
  • <идентификатор_секрета> — идентификатор секрета, созданного ранее.

В примере используется текстовая модель YandexGPT Pro (name: yandexgpt). Вы можете использовать другую модель, доступную в синхронном режиме в сервисе AI Studio.

Создайте рабочий процессСоздайте рабочий процесс

Консоль управления
Yandex Cloud CLI
API
  1. В консоли управления выберите сервис Serverless Integrations.

  2. На панели слева нажмите Workflows.

  3. В правом верхнем углу нажмите Создать рабочий процесс.

  4. Выберите способ YaML-спецификация.

  5. В редакторе кода вставьте текст подготовленной ранее YaWL-спецификации рабочего процесса.

  6. Раскройте блок Дополнительные параметры:

    1. Введите имя рабочего процесса. Требования к имени:

      • длина — от 2 до 63 символов;
      • может содержать строчные буквы латинского алфавита, цифры и дефисы;
      • первый символ — буква, последний — не дефис.
    2. Выберите сервисный аккаунт sa-workflows.

    3. В блоке Логирование отключите опцию Запись логов, если не хотите платить за хранение логов.

  7. Нажмите Создать.

  1. Посмотрите описание команды CLI для создания рабочего процесса:

    yc serverless workflow create --help
    
  2. Создайте рабочий процесс:

    yc serverless workflow create \
      --yaml-spec <файл_спецификации> \
      --name <имя_рабочего_процесса> \
      --service-account-id $WF_SA
    

    Где:

    • --yaml-spec — путь к файлу с YaWL-спецификацией рабочего процесса, подготовленной ранее. Например: ./yawl-spec.yaml.

    • --name — имя рабочего процесса. Требования к имени:

      • длина — от 2 до 63 символов;
      • может содержать строчные буквы латинского алфавита, цифры и дефисы;
      • первый символ — буква, последний — не дефис.
    • --service-account-id — идентификатор сервисного аккаунта sa-workflows.

    Результат:

    id: dfqjl5hh5p90********
    folder_id: b1g681qpemb4********
    specification:
      spec_yaml: "yawl: ..."
    created_at: "2025-03-11T09:27:51.691990Z"
    name: my-workflow
    status: ACTIVE
    log_options: {}
    service_account_id: aje4tpd9coa********
    

Чтобы создать рабочий процесс, воспользуйтесь методом REST API Create для ресурса Workflows или вызовом gRPC API Workflow/Create.

Настройте API-шлюзНастройте API-шлюз

Настройте API-шлюз в качестве вебхука Telegram.

Подготовьте спецификацию APIПодготовьте спецификацию API

Сохраните спецификацию API по стандарту OpenAPI 3.0 в YAML-файле, например api-spec.yaml:

openapi: 3.0.0
info:
  title: Telegram Webhook → Workflows
  version: 1.0.0
paths:
  /handle:
    post:
      x-yc-apigateway-integration:
        type: http
        method: POST
        service_account_id: <идентификатор_сервисного_аккаунта>  # сервисный аккаунт sa-apigw
        url: https://serverless-workflows.api.cloud.yandex.net/workflows/v1/execution/start
      requestBody:
        description: Telegram update passthrough to Workflows
        content:
          application/json:
            schema:
              x-yc-schema-mapping:
                type: static
                template:
                  workflowId: <идентификатор_рабочего_процесса>  # ваш рабочий процесс
                  input:
                    inputJson: ${.|tojson}  # весь апдейт Telegram как input

Где:

  • <идентификатор_сервисного_аккаунта> — идентификатор сервисного аккаунта sa-apigw.
  • <идентификатор_рабочего_процесса> — идентификатор рабочего процесса, созданного на предыдущем шаге.

Создайте API-шлюзСоздайте API-шлюз

Консоль управления
Yandex Cloud CLI
API
  1. В консоли управления выберите сервис API Gateway.

  2. Нажмите Создать API-шлюз.

  3. В поле Имя введите имя API-шлюза. Требования к имени:

    • длина — от 2 до 63 символов;
    • может содержать строчные буквы латинского алфавита, цифры и дефисы;
    • первый символ — буква, последний — не дефис.
  4. В блок Спецификация вставьте текст спецификации OpenAPI, подготовленной ранее.

  5. В блоке Логирование отключите опцию Запись логов, если не хотите платить за хранение логов.

  6. Нажмите Создать.

  7. Дождитесь создания API-шлюза и выберите его.

  8. Сохраните значение поля Служебный домен — оно понадобится на следующем шаге.

  1. Посмотрите описание команды CLI для создания API-шлюза:

    yc serverless api-gateway create --help
    
  2. Создайте API-шлюз:

    yc serverless api-gateway create \
      --name <имя_API-шлюза> \
      --spec=<путь_к_файлу_спецификации>
    

    Где:

    • --name — имя API-шлюза. Требования к имени:

      • длина — от 2 до 63 символов;
      • может содержать строчные буквы латинского алфавита, цифры и дефисы;
      • первый символ — буква, последний — не дефис.
    • --spec — путь к созданному ранее файлу со спецификацией.

    Результат:

    id: d5d63uh1h26g********
    folder_id: b1g681qpemb4********
    created_at: "2025-06-14T10:23:19.682Z"
    name: ai-bot-gw
    status: ACTIVE
    domain: d5d63uh1h26g********.********.apigw.yandexcloud.net
    connectivity: {}
    log_options:
      folder_id: b1g681qpemb4********
    execution_timeout: 300s
    
  3. Сохраните значение поля domain — оно понадобится на следующем шаге.

Чтобы создать API-шлюз, воспользуйтесь методом REST API Create для ресурса ApiGateway или вызовом gRPC API ApiGatewayService/Create.

Настройте вебхук для ботаНастройте вебхук для бота

CLI

Выполните команду:

curl -s "https://api.telegram.org/bot<токен_бота>/setWebhook" \
  -d "url=<служебный_домен>/handle"

Где:

  • <токен_бота> — токен, полученный при создании бота.
  • <служебный_домен> — служебный домен API-шлюза, полученный при его создании.

Например:

curl -s "https://api.telegram.org/bot1357246809:AAFhSteLniAw71g8jx6K5kTErO3********/setWebhook" \
  -d "url=https://d5d0jdhgrro2********.********.apigw.yandexcloud.net/handle"

Результат:

{"ok":true,"result":true,"description":"Webhook was set"}

Проверьте работу ботаПроверьте работу бота

  1. Найдите бота в Telegram по имени пользователя бота, созданного ранее.

  2. Нажмите СТАРТ, чтобы начать чат.

  3. Отправьте боту список из нескольких фильмов — по одному названию в строке.

    Например:

    Фильм 1
    Фильм 2
    Фильм 3
    

    Ответ бота:

    Здравствуйте! Спасибо за ваши предпочтения. На основе ваших любимых фильмов я могу предложить вам следующие кинокартины:
    ...
    Какой из предложенных фильмов вас заинтересовал? Или, может быть, у вас есть ещё какие-то предпочтения, которые вы хотели бы учесть?
    

Что дальшеЧто дальше

Попробуйте изменить YaWL-спецификацию рабочего процесса под вашу задачу. Например, измените запрос к текстовой модели:

...
call_ai:
  aiAgent:
    agentConfig:
      role: Ты консультант по подбору музыкальных исполнителей
      goal: >-
        Помочь пользователю выбрать музыку по его предпочтениям.
        При первом обращении попроси несколько любимых
        групп, музыкантов, композиторов, жанров (по одному в строке).
        Дальше используй их для рекомендаций и задавай уточняющие вопросы.

Также вы можете добавить текст или файлы в качестве источников информации. Подробнее см. описание интеграционного шага AIAgent.

Как удалить созданные ресурсыКак удалить созданные ресурсы

Чтобы перестать платить за созданные ресурсы:

  • Удалите API-шлюз.
  • Удалите рабочий процесс.
  • Удалите бакет.
  • Удалите секрет.
  • Если вы оставляли включенной опцию записи логов рабочего процесса или API-шлюза, удалите лог-группу.

Была ли статья полезна?

Предыдущая
Создание интеллектуального ассистента для Telegram
Следующая
ИИ-ревью пул-реквестов на GitHub с помощью Yandex Workflows и GitHub Actions
Проект Яндекса
© 2025 ООО «Яндекс.Облако»