В этой статье мы создадим Telegram-бота, который использует GPT-4 и другие языковые модели через API LLM_КИ. Вы получите готовый код, который можно сразу использовать в своих проектах.
Что мы создадим
Полнофункциональный Telegram-бот с:
- Поддержкой множества моделей (GPT-4, Claude, Gemini и др.)
- Сохранением контекста разговора
- Обработкой ошибок
- Гибкой настройкой поведения
Что нам понадобится
- API-ключ LLM_КИ — получите бесплатный ключ на llmki.ru/dashboard/keys
- Токен Telegram-бота — создайте бота через @BotFather
- Python 3.8+
- Библиотеки:
openai,python-telegram-bot
Шаг 1: Установка зависимостей
Создайте виртуальное окружение и установите необходимые пакеты:
# Создание виртуального окружения (опционально, но рекомендуется)
python -m venv venv
source venv/bin/activate # На Windows: venv\Scripts\activate
# Установка зависимостей
pip install openai python-telegram-bot
Шаг 2: Базовый код бота
Создайте файл bot.py со следующим содержимым:
import os
import logging
from telegram import Update
from telegram.ext import Application, CommandHandler, MessageHandler, filters, ContextTypes
import openai
# Настройка логирования
logging.basicConfig(
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
level=logging.INFO
)
logger = logging.getLogger(__name__)
# Настройка OpenAI клиента для LLM_КИ
# API полностью совместим с OpenAI SDK
client = openai.OpenAI(
api_key=os.getenv("LLMKI_API_KEY", "sk-llmki-ai-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"),
base_url="https://llmki.ru/v1"
)
# Хранение контекста для каждого пользователя
user_contexts = {}
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
"""Обработчик команды /start"""
await update.message.reply_text(
'Привет! Я бот с GPT-4. Задай мне любой вопрос!'
)
async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
"""Обработчик текстовых сообщений"""
user_id = update.effective_user.id
user_message = update.message.text
# Показываем индикатор печати
await context.bot.send_chat_action(
chat_id=update.effective_chat.id,
action="typing"
)
# Получаем или создаем контекст пользователя
if user_id not in user_contexts:
user_contexts[user_id] = [
{"role": "system", "content": "Ты полезный ассистент. Отвечай кратко и по делу."}
]
# Добавляем сообщение пользователя
user_contexts[user_id].append({"role": "user", "content": user_message})
# Ограничиваем длину контекста (последние 10 сообщений)
if len(user_contexts[user_id]) > 21: # system + 10 пар user/assistant
user_contexts[user_id] = user_contexts[user_id][:1] + user_contexts[user_id][-20:]
try:
# Отправляем запрос к GPT-4 через LLM_КИ
response = client.chat.completions.create(
model="openai/gpt-4o",
messages=user_contexts[user_id],
max_tokens=1000,
temperature=0.7
)
bot_response = response.choices[0].message.content
# Добавляем ответ бота в контекст
user_contexts[user_id].append({"role": "assistant", "content": bot_response})
await update.message.reply_text(bot_response)
except openai.APIError as e:
logger.error(f"API ошибка: {e}")
await update.message.reply_text(
f"Ошибка API: {e.message if hasattr(e, 'message') else str(e)}"
)
except Exception as e:
logger.error(f"Неожиданная ошибка: {e}")
await update.message.reply_text("Извините, произошла ошибка. Попробуйте позже.")
def main() -> None:
"""Запуск бота"""
# Получаем токен из переменной окружения
bot_token = os.getenv("TELEGRAM_BOT_TOKEN", "YOUR_TELEGRAM_BOT_TOKEN")
if bot_token == "YOUR_TELEGRAM_BOT_TOKEN":
logger.error("Установите переменную окружения TELEGRAM_BOT_TOKEN")
return
application = Application.builder().token(bot_token).build()
# Регистрируем обработчики
application.add_handler(CommandHandler("start", start))
application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message))
# Запускаем бота
logger.info("Бот запущен...")
application.run_polling()
if __name__ == '__main__':
main()
Шаг 3: Получение токенов
API-ключ LLM_КИ
- Зарегистрируйтесь на llmki.ru/register
- Перейдите в личный кабинет
- Создайте новый API-ключ
- Скопируйте ключ (формат:
sk-llmki-ai-...)
Telegram Bot Token
- Напишите @BotFather в Telegram
- Отправьте команду
/newbot - Следуйте инструкциям для создания бота
- Скопируйте полученный токен
Шаг 4: Настройка и запуск
Создайте файл .env (или установите переменные окружения):
TELEGRAM_BOT_TOKEN=ваш_токен_от_botfather
LLMKI_API_KEY=sk-llmki-ai-ваш_ключ
Запустите бота:
python bot.py
Улучшения: выбор модели
Добавьте возможность выбора модели через команду:
# Хранение выбранной модели для каждого пользователя
user_models = {}
async def set_model(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
"""Команда для смены модели"""
if context.args:
model = context.args[0]
user_id = update.effective_user.id
# Список доступных моделей через LLM_КИ
available_models = [
"openai/gpt-4o",
"openai/gpt-4o-mini",
"anthropic/claude-3.5-sonnet",
"anthropic/claude-3-haiku",
"google/gemini-pro",
"meta/llama-3.1-70b"
]
if model in available_models:
user_models[user_id] = model
await update.message.reply_text(f"✅ Модель изменена на {model}")
else:
await update.message.reply_text(
f"❌ Неверная модель.\n\n"
f"Доступные модели:\n" + "\n".join(f"• {m}" for m in available_models)
)
else:
await update.message.reply_text(
"Использование: /model <название_модели>\n\n"
"Пример: /model openai/gpt-4o"
)
# В функции handle_message используйте выбранную модель:
model = user_models.get(user_id, "openai/gpt-4o")
response = client.chat.completions.create(
model=model,
messages=user_contexts[user_id],
...
)
# В main() добавьте:
application.add_handler(CommandHandler("model", set_model))
Улучшения: команда /reset
Добавьте возможность сброса контекста:
async def reset_context(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
"""Сброс контекста разговора"""
user_id = update.effective_user.id
if user_id in user_contexts:
del user_contexts[user_id]
await update.message.reply_text("✅ Контекст разговора сброшен")
# В main():
application.add_handler(CommandHandler("reset", reset_context))
Обработка ошибок
Для более надежной работы добавьте обработку различных типов ошибок:
async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
# ... код получения сообщения ...
try:
response = client.chat.completions.create(
model="openai/gpt-4o",
messages=user_contexts[user_id],
max_tokens=1000,
temperature=0.7
)
bot_response = response.choices[0].message.content
user_contexts[user_id].append({"role": "assistant", "content": bot_response})
await update.message.reply_text(bot_response)
except openai.RateLimitError:
await update.message.reply_text(
"⚠️ Превышен лимит запросов. Попробуйте через минуту."
)
except openai.APIError as e:
if "insufficient_quota" in str(e).lower():
await update.message.reply_text(
"⚠️ Недостаточно средств на балансе. Пополните счет в личном кабинете."
)
else:
logger.error(f"API ошибка: {e}")
await update.message.reply_text(f"Ошибка API: {str(e)}")
except Exception as e:
logger.error(f"Неожиданная ошибка: {e}", exc_info=True)
await update.message.reply_text("Произошла ошибка. Попробуйте позже.")
Преимущества использования LLM_КИ
- Единый API для всех моделей — не нужно переписывать код при смене провайдера
- Оплата в рублях — удобно для российских разработчиков
- Прозрачные цены — видите стоимость каждого запроса
- Высокая доступность — стабильная работа API
- Поддержка streaming — для длинных ответов
Полный пример кода
Полный рабочий пример с всеми улучшениями доступен в нашем GitHub репозитории (ссылка будет добавлена).
Заключение
За 10 минут мы создали полнофункционального Telegram-бота с поддержкой GPT-4 и других моделей. API LLM_КИ позволяет легко интегрировать различные языковые модели с минимальными изменениями в коде.
Что дальше?
- Добавьте обработку изображений (мультимодальные модели)
- Интегрируйте базу данных для хранения истории
- Реализуйте систему ролей и персонализации
- Добавьте поддержку голосовых сообщений
- Используйте streaming для длинных ответов
Полезные ссылки
Попробуйте сами и делитесь результатами!