
2
Универсальный AI Telegram Bot
Я писал у себя в telegram-канале, что давно сделал себе GPT's в ChatGPT - 'Russian > English Corrector and Translator' для помощи в изучении английского. Он достаточно простой, но в то же время полезный:
- Присылаете слово на английском - получаете словарную карточку с определением, частью речи, примерами и тп.
- Присылаете текст на русском - получаете прямой перевод и пояснения, почему переведено именно так.
- Присылаете текст на английском - он проверяется на ошибки и стилистические ошибки и предлагается скорректированная версия также с пояснениями.
Но ходить каждый раз в ChatGPT неудобно - гораздо удобнее было бы то же самое получать через Telegram.
Сама задача достаточно тривиально, к тому же я уже написал локальный эмулятор телеграм, чтобы тестировать ботов локально с хуками.
Реализация
Собственно, про процесс разработки особо писать не вижу смысла - все написано, как обычно, с помощью Cursor, расскажу лучше о внутреннем устройстве.
Программа на go, по сути выступает в режиме прокси между Telegram и AI. Для связи с Telegram нужен API-ключ бота, выданный @BotFather. Для подключения к AI - OpenAI-совместимый API. Я использую OpenRouter с бесплатной моделью.
У бота есть 2 простые команды /start и /help, на которые он отвечает сообщениями, заданными в конфиге.
Все прочие сообщения от пользователей бот отправляет LLM, предварительно указав указанный в конфиге промпт.
Контекст не хранится и не учитывается, так что в режиме диалога с таким ботом поболтать не выйдет, только одиночными сообщениями. Медиафайлы и файлы в целом - тоже не пока поддерживаются, так чтов се взаимодействие исключительно текстом.
Установка и запуск
Так как сама программа на go - для неё в github сразу собираются бинарники для всех систем, которые не требуют других зависимостей. Посмотреть актуальный список можно на релизной странице: https://github.com/positron48/universal-ai-bot/releases.
Также вам для запуска нужно положить рядом .env
файл конфигурации. Пример с полным перечнем переменных также можно посмотреть в репозитории: https://github.com/positron48/universal-ai-bot/blob/master/env.example
Минимально необходимые значения:
TELEGRAM_TOKEN
- токен бота, полученный от @BotFather;AI_API_KEY
- API ключ для доступа к API модели;AI_URL
- OpenAI-совместимый API url модели, к которой будете обращаться, по умолчанию там указан OpenRouter, но вы можете хоть локально постамить lmstudio и попробовать с ней;AI_MODEL
- по умолчанию qwen/qwen3-coder:free из OpenRouter, но помните что для работы бесплатных моделей по API нужно включить возможность их обучения на ваших запросах и запоминание промптов, так что это максимально не конфиденциальный способ связи.
Ну и еще больше параметров найдете в моем github. Можно настроить работу через webhook (по умолчанию long polling).
Отдельно, конечно, настраиваются сообщения и системный промпт модели. Например, мои настройки для бота выглядят так:
AI_PROMPT_FILE=prompts/english-teacher.txt
# Bot Messages Configuration (optional - uses defaults if not set)
BOT_START_MESSAGE='🇬🇧 Привет! Я ваш персональный преподаватель английского языка!\n\n📝 Что я умею:\n• Исправлять ошибки в английском тексте\n• Переводить с русского на английский\n• Создавать карточки слов с объяснениями\n\n💡 Ка>
BOT_HELP_MESSAGE='📚 Помощь по использованию бота-преподавателя английского:\n\n🔤 **Одно слово** → Карточка слова с:\n• Частью речи\n• Транскрипцией IPA\n• Определением на русском\n• Примерами использования\n• Формами неправильны>
BOT_UNKNOWN_COMMAND_MESSAGE='❓ Неизвестная команда. Используйте /help для получения информации о возможностях бота.'
BOT_ERROR_MESSAGE='Извините, при обработке сообщения произошла ошибка. Попробуйте позднее.'
BOT_EMPTY_MESSAGE='Пожалуйста, отправьте сообщение.'
Системный промпт тоже не секретный и лежит в репозитории: https://github.com/positron48/universal-ai-bot/blob/master/prompts/english-teacher.txt
После всех настроек просто запускаете бинарник - если все сделано правильно - бот начнет работать.
Деплой
Я пошел чуть дальше, все же следить за тем что бинарник запущен и перезапускать при падениях руками - не наш путь.
Поэтому в репозитории также есть подробная инструкция по настройке автодеплоя на сервер из github (если вы хотите склонировать репозиторий и доработать код) - https://github.com/positron48/universal-ai-bot/blob/master/DEPLOYMENT.md
Вкратце - работает вроде в соответствии с best practice по деплою из гитхаба.
На сервере (у меня ubuntu VPS) нужно создать служебного пользователя, от имени которого будет запускаться бот. Там же ему даются все нужные права и забираются ненужные.
Далее генерируем ssh ключи для этого пользователя, указываем приватный ключ в секретах экшнов репозитория наряду с данными по серверу (куда гитхаб должен коннектиться).
Из интересного - я узнал что можно через ~/.ssh/authorized_keys
настроить, какие команды сможет запускать пользователь, подключившийся по ssh. Например для деплоя:
# Add this line to ~/.ssh/authorized_keys
command="cd /path/to/your/bot && make update",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... deploy@your-domain.com
Т.е. мы разрешаем только одну команду из автодеплоя - зайти в папку с ботом и запустить make update (он уже внутри скачивает последний релизный бинарник и перезапускает сервис systemctl на сервере).
Ну и в качестве заключения - сам бот открытый, можете найти его как @positroid_english_bot.
Помимо репозитория непосредственно AI бота я также подготовил и просто скелетон Telegram-бота на go - этот уже может быть полезен только непосредственно разработчикам, так как предполагает доработку кода. Правда из коробки тоже работает с простыми командами - на его основе сделан и AI-бот.
Комментариев пока нет
-
Анализ истории просмотров Youtube
Задумывались, сколько времени вы проводите за просмотром видео? Давайте считать. -
Image2model с tripo3d и Blender
Иногда хочется, чтобы нарисованный или сгенерированный персонаж стал настоящим -
Локальный эмулятор Telegram
Писали ли вы когда-нибудь телеграм ботов? -
Реанимируем основание вешалок
Есть дома пара вешалок с плечиками, на которых удобно располагается одежда для… -
Ложемент для столовых приборов
Органайзинг - одна из сфер, куда я периодически пытаюсь приложить руку. На этот… -
Кросс-постинг инженерного DIY-контента
Начал выходить за рамки личного блога, кажется, что часть контента заслуживает…