Перейти к содержанию
Innovialabs

Как подключить ChatGPT или Claude к Telegram-боту

Практика4 мин

Коротко

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

Как устроена схема

Поток простой: Telegram → ваш бэкенд → API модели → обратно в Telegram. Бэкенд получает апдейт через вебхук или polling, добавляет сообщение в историю пользователя, отправляет историю в API OpenAI или Anthropic и возвращает ответ в чат.

Всё, что влияет на качество, стоимость и безопасность, происходит в этом среднем слое: хранение контекста, стриминг, форматирование, лимиты и модерация.

Ключи API — только на бэкенде

  • Храните ключ в переменной окружения или менеджере секретов, никогда в репозитории или во фронтенде Mini App.
  • Используйте разные ключи для разработки и продакшена, чтобы утечка тестового ключа не открывала боевой аккаунт.
  • Настройте лимиты расходов и уведомления в консоли провайдера.
  • Если ключ утёк, сразу отзовите его и выпустите новый — не ждите, воспользуются ли им.

Контекст диалога для каждого пользователя

API моделей не хранят состояние: в каждый запрос нужно передавать переписку целиком. Хранить её приходится вам.

  • Держите сообщения в Redis или базе данных с ключом по chat_id (в группах — по чату и пользователю).
  • Обрезайте историю: последние N сообщений или в пределах бюджета токенов. Старую часть можно заменить коротким резюме.
  • Добавьте команду /new, чтобы пользователь мог сбросить контекст при смене темы.
  • Сообщите пользователям, что переписка хранится и сколько, и удаляйте старые данные по расписанию.

Длинная история — главная причина тихого роста расходов: каждое новое сообщение повторно отправляет всё, что было до него.

Стриминг через редактирование сообщения

Ждать длинный ответ без обратной связи — ощущение, что бот сломался. Обычный приём: отправить заглушку и редактировать её по мере поступления текста.

import time
from aiogram.exceptions import TelegramBadRequest

async def stream_reply(message, history):
    sent = await message.answer("...")
    text, last_edit = "", 0.0
    async for chunk in llm_stream(history):  # ваша обёртка над SDK
        text += chunk
        if time.monotonic() - last_edit > 1.5:
            await safe_edit(sent, text)
            last_edit = time.monotonic()
    await safe_edit(sent, text)
    return text

async def safe_edit(sent, text):
    try:
        await sent.edit_text(text[:4096])
    except TelegramBadRequest:
        pass  # например, "message is not modified"

Главные правила:

  • Редактируйте раз в секунду-две, а не на каждый токен. Telegram ограничивает частоту правок, и при перегрузке отвечает ошибкой 429 со значением retry_after.
  • В сообщении максимум 4096 символов. Когда ответ длиннее, завершите текущее сообщение и продолжайте в новом.
  • Стримьте обычным текстом, а форматирование применяйте только к финальной версии.
  • В новых версиях Bot API появился встроенный стриминг черновиков в личных чатах — проверьте в официальной документации, что поддерживает ваша библиотека.

Подводные камни форматирования Markdown

Модели пишут стандартный Markdown: **жирный**, заголовки #, таблицы. MarkdownV2 в Telegram — другой диалект: жирный — это *текст*, а символы _ * [ ] ( ) ~ > # + - = | { } . ! нужно экранировать. Одна неэкранированная точка или незакрытая звёздочка — и API вернёт «can't parse entities».

Надёжный подход:

  1. Конвертируйте Markdown модели в Telegram HTML (<b>, <i>, <code>, <pre>, <a>), экранируя <, > и & в тексте.
  2. Заголовки превращайте в жирные строки, таблицы — в списки или блок кода: таблиц в Telegram нет.
  3. Если отправка всё равно падает, отправьте обычный текст, а не теряйте ответ.
  4. Попросите модель в системном промпте не использовать таблицы и глубокую вложенность.

Лимиты частоты и стоимости

ЛимитЗачем
Запросы на пользователя в минутуЗащита от спама и скриптов
Дневной бюджет токенов на пользователяОграничивает стоимость одного активного пользователя
Максимум токенов в ответеНе даёт ответу разрастись
Максимальная длина вводаОтсекает вставленные «простыни»
Одна активная генерация на пользователяИсключает параллельные запросы от двойных нажатий
Общий месячный лимит с алертамиЗащищает весь бюджет

Считайте расход по полю usage в ответах API, а не на глаз, и показывайте понятное сообщение, когда пользователь упёрся в лимит.

Модерация пользовательского ввода

  • Проверяйте длину и очевидный спам до вызова модели.
  • Если бот публичный, пропускайте ввод через moderation-эндпоинт или дешёвую модель-классификатор.
  • Считайте prompt injection данностью: пользователи будут пытаться переписать системный промпт. Не кладите в него секреты, а если модель вызывает инструменты, проверяйте каждое действие на сервере.
  • Логируйте отмеченные сообщения, дайте админам возможность блокировать пользователей и проверяйте ответы, если бот работает в публичных группах.

Частые вопросы

Оба API подключаются по одной схеме. Сравните качество ответов на ваших реальных задачах, цену и политику обработки данных, а между ботом и провайдером держите тонкую обёртку, чтобы сменить модель без переписывания бота.

Читайте также

Есть идея или задача? Расскажите нам

Ответим в течение рабочего дня и предложим решение. Консультация бесплатная.