Своего Telegram-бота с нейросетью внутри можно собрать за один вечер. DeepSeek для этого подходит особенно хорошо: его API совместим с форматом OpenAI, поэтому работает с привычной библиотекой openai для Python, а стоит недорого.
В этой инструкции соберём простого, но рабочего бота: он помнит последние сообщения диалога, обрабатывает ошибки и не упирается в ограничение Telegram на длину сообщения. Весь код — около 50 строк.
Что понадобится
- Python 3.10 или новее — этого требует актуальная версия aiogram;
- токен Telegram-бота — получим у @BotFather;
- ключ DeepSeek API и пополненный баланс на platform.deepseek.com;
- компьютер или сервер, где бот будет работать постоянно.
Шаг 1. Создаём бота в BotFather
- Откройте в Telegram официальный аккаунт @BotFather.
- Отправьте команду /newbot.
- Придумайте имя бота и его username — он должен заканчиваться на bot.
- BotFather пришлёт токен — длинную строку вида 123456:ABC… Это пароль от бота: никому его не показывайте.
Если токен утёк, его можно отозвать и выпустить новый через того же BotFather. Будьте внимательны с похожими аккаунтами: проверяйте, что общаетесь с настоящим @BotFather, — о том, как отличить настоящего бота от подделки, мы рассказывали отдельно.
Шаг 2. Получаем ключ DeepSeek
- Зарегистрируйтесь на platform.deepseek.com.
- В разделе API keys создайте новый ключ и сразу сохраните его.
- Пополните баланс: без денег на счёте API вернёт ошибку 402.
Подробнее о ключах, моделях и тарифах — в нашей статье о ключе и тарифах API.
Шаг 3. Устанавливаем библиотеки
Создайте папку проекта и установите две библиотеки: aiogram для Telegram и openai для запросов к DeepSeek.
python -m venv venv
source venv/bin/activate
pip install aiogram openai
На Windows вместо второй строки выполните venv\Scripts\activate.
Шаг 4. Храним ключи правильно
Не вписывайте токены прямо в код — особенно если собираетесь выкладывать его на GitHub. Задайте их переменными окружения:
export TELEGRAM_BOT_TOKEN="токен_от_BotFather"
export DEEPSEEK_API_KEY="ключ_DeepSeek"
Шаг 5. Код бота
Сохраните файл bot.py:
import asyncio
import os
from aiogram import Bot, Dispatcher, F
from aiogram.filters import CommandStart
from aiogram.types import Message
from openai import AsyncOpenAI, APIError
bot = Bot(token=os.environ["TELEGRAM_BOT_TOKEN"])
dp = Dispatcher()
client = AsyncOpenAI(
api_key=os.environ["DEEPSEEK_API_KEY"],
base_url="https://api.deepseek.com",
)
SYSTEM = {"role": "system", "content": "Ты дружелюбный помощник. Отвечай по-русски и по делу."}
history: dict[int, list[dict]] = {}
@dp.message(CommandStart())
async def start(message: Message):
history[message.from_user.id] = []
await message.answer("Привет! Задайте вопрос, и я отвечу с помощью DeepSeek.")
@dp.message(F.text)
async def chat(message: Message):
msgs = history.setdefault(message.from_user.id, [])
msgs.append({"role": "user", "content": message.text})
del msgs[:-10] # храним только 10 последних сообщений
while msgs and msgs[0]["role"] != "user": # история должна начинаться с вопроса
msgs.pop(0)
await bot.send_chat_action(message.chat.id, "typing")
try:
resp = await client.chat.completions.create(
model="deepseek-flash",
messages=[SYSTEM, *msgs],
extra_body={"thinking": {"type": "disabled"}},
)
except APIError:
await message.answer("DeepSeek сейчас не отвечает, попробуйте чуть позже.")
return
answer = resp.choices[0].message.content or "Пустой ответ, попробуйте переформулировать."
msgs.append({"role": "assistant", "content": answer})
for i in range(0, len(answer), 4000): # лимит Telegram: 4096 символов
await message.answer(answer[i:i + 4000])
async def main():
await dp.start_polling(bot)
if __name__ == "__main__":
asyncio.run(main())
Запустите бота командой python bot.py, откройте его в Telegram и нажмите «Старт».
Как работает код
- base_url=»https://api.deepseek.com» — именно эта строка перенаправляет библиотеку openai с серверов OpenAI на DeepSeek.
- model=»deepseek-flash» — актуальная модель DeepSeek-V4.1-Flash. Старые имена deepseek-chat и deepseek-reasoner отключены после 24 июля 2026 года, поэтому код из старых инструкций с ними работать не будет.
- thinking: disabled — в API DeepSeek режим рассуждений включён по умолчанию. Для чат-бота с быстрыми ответами мы его отключаем. Если бот должен решать сложные задачи, уберите эту строку: ответы станут точнее, но медленнее и дороже.
- history — словарь, где для каждого пользователя хранятся последние 10 сообщений. Так бот помнит контекст разговора. Данные лежат в памяти и пропадают при перезапуске.
- Нарезка ответа — Telegram принимает сообщения длиной до 4096 символов, поэтому длинный ответ отправляется частями по 4000.
Шаг 6. Ошибки, которые стоит обработать
| Код DeepSeek | Что значит | Что делать |
|---|---|---|
| 401 | Неверный ключ | Проверить DEEPSEEK_API_KEY |
| 402 | Закончился баланс | Пополнить счёт |
| 429 | Слишком много запросов | Сделать паузу и повторить |
| 500 / 503 | Ошибка или перегрузка сервера | Повторить через некоторое время |
В нашем коде все эти случаи ловятся одним блоком except APIError, и пользователь получает понятное сообщение вместо тишины.
Помните и про ограничения Telegram: в одном чате бот не должен отправлять больше одного сообщения в секунду, иначе получит ошибку 429. Для массовых рассылок лимит — около 30 сообщений в секунду.
Сколько это стоит
Оплата идёт за токены: входящие (вопрос и история) и исходящие (ответ). Для deepseek-flash цена за 1 млн токенов — $0,30 за вход без кэша и $1,20 за выход в пиковые часы, вдвое дешевле в непиковые. Пиковые часы — с 04:00 до 07:00 и с 09:00 до 13:00 по Москве в будни.
Каждый раз бот отправляет всю сохранённую историю заново, поэтому чем длиннее память, тем дороже запрос. Ограничение в 10 сообщений — разумный баланс. Как считать токены точнее, подробно разобрано в статье про расчёт токенов в API.
Как развивать бота дальше
- Сохранять историю в базе данных — SQLite или PostgreSQL, чтобы она не терялась при перезапуске.
- Стриминг ответа — параметр stream=True позволяет показывать ответ по мере генерации, редактируя сообщение.
- Команды — /reset для очистки истории, /think для включения режима рассуждений.
- Ограничения для пользователей — лимит запросов в день, чтобы один человек не потратил весь баланс.
- Вебхук вместо опроса — для работы на сервере. В Telegram это два взаимоисключающих способа получать обновления: getUpdates (как в нашем примере) или webhook.
- Распознавание картинок — deepseek-flash поддерживает изображения во входных данных, так что бот может научиться отвечать по фото.
Где запустить бота
Пока бот работает на вашем компьютере, он отвечает, только когда компьютер включён. Для постоянной работы подойдёт недорогой VPS: бот на aiogram почти не нагружает сервер, ведь вся тяжёлая работа выполняется на стороне DeepSeek.
Частые вопросы
Можно ли сделать бота на DeepSeek бесплатно?
Telegram-бот и библиотеки бесплатны, но API DeepSeek платный: запросы оплачиваются с баланса. Для личного бота с небольшим числом сообщений расходы обычно скромные.
Почему бот не отвечает?
Проверьте, что скрипт запущен, переменные окружения заданы и на балансе DeepSeek есть деньги. Ошибки выводятся в консоль, где запущен бот.
Как включить режим рассуждений?
Уберите строку extra_body с thinking: disabled. По умолчанию API DeepSeek работает в режиме рассуждений с уровнем усилий high.
Можно ли использовать модель deepseek-reasoner?
Нет, это старое имя, и оно больше не работает. Используйте deepseek-flash или deepseek-v4-pro и управляйте рассуждениями параметром thinking.
Где хранится переписка с ботом?
В нашем примере история хранится только в памяти скрипта и стирается при перезапуске. При этом каждое сообщение отправляется в API DeepSeek, поэтому предупредите пользователей бота, что их запросы обрабатывает внешняя нейросеть.
