DEV Community

Promptra Team for Promptra

Posted on

Как сделать чат-бота на нейросети через API

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

Чтобы сделать чат-бота на нейросети, не нужно обучать свою модель и поднимать GPU-кластер. Достаточно взять готовую LLM — GPT, Claude или Gemini — и обращаться к ней по HTTP через API. Минимальный рабочий чат-бот на GPT — это примерно 15 строк Python: вы отправляете список сообщений в эндпоинт chat/completions, получаете ответ модели и показываете его пользователю. Вся «магия» уже внутри модели; ваша задача как разработчика — собрать вокруг неё тонкий слой: хранить историю диалога, подмешивать системный промпт, выбрать модель под бюджет и подключить транспорт (веб-чат, Telegram-бот, виджет на сайте).

Эта статья — пошаговый инженерный гайд для тех, кто пишет код. Разберём архитектуру чат-бота на нейросети от запроса пользователя до ответа модели, дадим рабочий Python-код с поддержкой контекста диалога, покажем, как gemini-чат-бот и бот на GPT отличаются только идентификатором модели в одном и том же коде, соберём Telegram-бот как реальный пример и посчитаем, во сколько обойдётся каждый запрос в рублях. Цены — из нашего каталога на 2026-05-29, без наценки на токены, оплата на юрлицо в рублях с закрывающими документами. Поехали.

Что такое чат-бот на нейросети через API

Чат-бот на нейросети — это приложение, которое принимает текст от пользователя, отправляет его большой языковой модели (LLM) и возвращает сгенерированный ответ. Слово «через API» здесь ключевое: вместо того чтобы держать модель у себя, вы вызываете её как внешний сервис по сети. Провайдер (OpenAI, Anthropic, Google) держит модель на своих серверах, а вы платите за токены — единицы текста, которые модель прочитала на входе и сгенерировала на выходе. Подробнее — актуальные тарифы LLM в рублях.

Принципиальное отличие чат-бота от одиночного запроса — память диалога. Сама по себе LLM не помнит предыдущие реплики: каждый запрос к API независим (stateless). Чтобы бот «помнил» контекст разговора, ваше приложение должно при каждом новом сообщении отправлять модели всю предыдущую переписку — список сообщений с ролями system, user, assistant. Именно поэтому архитектура чат-бота крутится вокруг управления этим списком: куда его складывать, как обрезать, когда сбрасывать.

Чем чат-бот на API отличается от готовых решений вроде интерфейса ChatGPT:

  • Готовый продукт (ChatGPT, Claude.ai) — это веб-приложение для конечного пользователя. Вы не контролируете промпты, не интегрируете в свой продукт, не получаете программный доступ.
  • Чат-бот на API — это ваш код. Вы задаёте поведение системным промптом, подключаете свою базу знаний, встраиваете бота в Telegram, на сайт, в CRM, в мобильное приложение — куда угодно, где есть HTTP-клиент.

Для российской команды есть ещё один слой: прямой доступ к API OpenAI, Anthropic и Google из РФ затруднён — карты не проходят, аккаунты блокируются. Поэтому в коде ниже мы обращаемся не напрямую к провайдеру, а через OpenAI-совместимый шлюз с рублёвой оплатой. С точки зрения кода разница — одна строка base_url. Подробно про доступ и оплату мы писали в гайде OpenAI API в России 2026.

Архитектура чат-бота: от запроса пользователя до ответа модели

Любой чат-бот на нейросети — это три слоя плюс внешний LLM API. Разберём поток одного сообщения.

  1. Клиент (транспорт). Откуда приходит текст: окно веб-чата, Telegram, виджет на сайте, голосовой ввод. Клиент только передаёт строку пользователя в бэкенд и показывает ответ.
  2. Бэкенд (ваш код). Сердце бота. Здесь живёт логика: получить сообщение, достать историю диалога этого пользователя, добавить системный промпт, собрать массив messages, вызвать LLM API, получить ответ, сохранить его в историю, вернуть клиенту.
  3. Хранилище состояния. Где лежит история переписки: в оперативной памяти процесса (для прототипа), в Redis (для продакшена с тысячами пользователей), в Postgres (если нужна постоянная история). Ключ — идентификатор пользователя или чата.
  4. LLM API. Внешний эндпоинт chat/completions, в который уходит массив сообщений и возвращается ответ модели.

Блок-схема потока сообщения в чат-боте: клиент передаёт текст в бэкенд, бэкенд достаёт историю из хранилища, добавляет системный промпт, отправляет массив сообщений в LLM API и возвращает ответ обратно клиенту

Что важно понять про массив messages — это и есть «состояние» диалога, которое вы каждый раз пересобираете и отправляете модели целиком:

[
 {"role": "system", "content": "Ты вежливый ассистент службы поддержки."},
 {"role": "user", "content": "Привет, как сбросить пароль?"},
 {"role": "assistant", "content": "Здравствуйте! Откройте настройки и..."},
 {"role": "user", "content": "А если у меня нет доступа к почте?"}
]
Enter fullscreen mode Exit fullscreen mode

Роль system задаёт характер и правила бота, роли user и assistant чередуются — это история. Модель читает весь массив и продолжает диалог следующей репликой assistant. Каждое сообщение в массиве — это входные токены, за которые вы платите. Отсюда главное архитектурное напряжение чат-бота: чем длиннее история, тем «умнее» контекст, но тем дороже каждый запрос. Об управлении этим — отдельный раздел ниже.

Рабочий Python-код: чат-бот с историей диалога

Перейдём к коду. Используем официальную библиотеку openai — она работает с любым OpenAI-совместимым эндпоинтом, в том числе с нашим. Установка:

pip install openai
Enter fullscreen mode Exit fullscreen mode

Минимальный чат-бот без памяти — один запрос, одна реплика:

from openai import OpenAI

client = OpenAI(
 api_key="prm-xxxxxxxxxxxx", # ключ из личного кабинета
 base_url="https://api.promptra.ru/v1", # OpenAI-совместимый шлюз
)

response = client.chat.completions.create(
 model="openai/gpt-5.4",
 messages=[
 {"role": "system", "content": "Ты лаконичный ассистент. Отвечай по-русски."},
 {"role": "user", "content": "Объясни, что такое токен в LLM, в двух предложениях."},
 ],
)

print(response.choices[0].message.content)
Enter fullscreen mode Exit fullscreen mode

Это уже работающий чат-бот на GPT, но без памяти: он ответит на один вопрос и забудет его. Чтобы бот держал контекст диалога, нужно хранить и пополнять массив messages. Вот полноценный консольный чат-бот с историей:

from openai import OpenAI

client = OpenAI(
 api_key="prm-xxxxxxxxxxxx",
 base_url="https://api.promptra.ru/v1",
)

SYSTEM_PROMPT = "Ты дружелюбный ассистент. Отвечай кратко и по делу, по-русски."

# История диалога. Системный промпт всегда первый.
history = [{"role": "system", "content": SYSTEM_PROMPT}]

def ask(user_text: str) -> str:
 # 1. Добавляем реплику пользователя в историю
 history.append({"role": "user", "content": user_text})

 # 2. Отправляем модели ВСЮ историю целиком
 response = client.chat.completions.create(
 model="openai/gpt-5.4",
 messages=history,
 temperature=0.6,
 )

 # 3. Сохраняем ответ модели — чтобы помнить его в следующем запросе
 answer = response.choices[0].message.content
 history.append({"role": "assistant", "content": answer})
 return answer

if __name__ == "__main__":
 print("Чат-бот запущен. Введите 'выход' для завершения.")
 while True:
 text = input("Вы: ")
 if text.strip.lower in {"выход", "exit", "quit"}:
 break
 print("Бот:", ask(text))
Enter fullscreen mode Exit fullscreen mode

Запустите его, и бот будет помнить разговор: спросите «как меня зовут?» после того как представитесь — он вспомнит, потому что вся переписка уезжает модели при каждом запросе. Три шага в функции ask — это и есть вся суть чат-бота: добавить вопрос, отправить историю, сохранить ответ.

Несколько практических деталей этого кода:

  • temperature — степень «творчества» модели от 0 до 2. Для поддержки и фактических ответов ставьте 0.2–0.5, для генерации идей и текстов — 0.7–1.0.
  • response.usage — в ответе модель возвращает prompt_tokens и completion_tokens. Это ровно то, за что вы платите. Логируйте их с первого дня, чтобы видеть расход.
  • Стриминг. Добавьте stream=True, и ответ придёт по кусочкам (как печатающийся текст в ChatGPT) — это улучшает ощущение скорости. Для веб- и Telegram-ботов почти обязательно.

Ограничение истории: как не сжечь бюджет на длинных диалогах

Наивное хранение всей истории имеет проблему: после 50 реплик каждый запрос тащит модели всю переписку, и вы платите за входные токены снова и снова. Контекст у современных моделей огромный (у GPT-5.4 и Claude Sonnet 4.6 — порядка миллиона токенов), так что технически влезет всё, но платить за это незачем. Две стандартные стратегии:

  • Скользящее окно. Храните системный промпт плюс последние N пар «вопрос-ответ» (например, 10). Старые реплики выкидываете. Просто и работает для большинства ботов.
  • Суммаризация. Когда история разрастается, отдельным дешёвым запросом просите модель сжать старую часть диалога в короткое резюме и заменяете им хвост истории. Сложнее, но сохраняет смысл длинных разговоров.

Простое скользящее окно поверх кода выше:

MAX_TURNS = 10 # сколько последних пар «вопрос-ответ» помнить

def trim(history: list) -> list:
 system = history[:1] # системный промпт сохраняем всегда
 dialogue = history[1:]
 # оставляем последние MAX_TURNS*2 сообщений (вопрос + ответ)
 return system + dialogue[-MAX_TURNS * 2 :]
Enter fullscreen mode Exit fullscreen mode

Вызывайте history = trim(history) перед каждым запросом — и расход на входные токены перестанет расти бесконтрольно.

Выбор модели под бюджет: Sonnet, GPT-5.4, DeepSeek или флагман

Главное решение, которое определяет и качество, и счёт вашего чат-бота, — какую модель подключить. Хорошая новость: в OpenAI-совместимом API модель — это просто строка в параметре model. Сменить GPT на Claude или Gemini — поменять один идентификатор, код не трогаете.

Правило выбора простое: дорогую флагманскую модель берут только там, где дешёвая систематически ошибается. Для массовых задач чат-бота — ответы на типовые вопросы, классификация обращений, извлечение полей из текста — разница в качестве между флагманом и средней моделью почти не видна, а в счёте видна сразу. Для сложного многошагового рассуждения, длинного кода, анализа с множеством условий — наоборот, экономия на модели выходит дороже из-за ошибок.

Цены ниже — из нашего каталога на 2026-05-29, рубли за 1 млн токенов, по курсу ЦБ 71.668 ₽/$, без наценки на токены. Для чат-бота обычно важнее output (ответы модели длиннее, чем вопросы):

Модель Вход, ₽/1М Выход, ₽/1М Контекст Когда брать в чат-бот
Claude Haiku 4.5 70 350 200K Роутинг, классификация, простые ответы
Qwen 3.6 Plus 20 130 1M Массовые ответы, многоязычие, бюджет
DeepSeek V4 Pro 30 60 1M Самый дешёвый под объём, код и логика
GPT-5.4 Mini 50 320 400K Дешёвый GPT для автоматизации
Claude Sonnet 4.6 210 1070 1M Баланс качества и цены, рабочая лошадка
GPT-5.4 170 1070 1.05M Универсал для чата и общих задач
Gemini 3.1 Pro Preview 140 860 1M Сильный reasoning, мультимодал с аудио
Claude Opus 4.7 350 1790 1M Сложный код, агенты, долгое рассуждение
GPT-5.5 350 2150 1.05M Флагман OpenAI для самых тяжёлых задач

Горизонтальная столбчатая диаграмма стоимости 1 млн выходных токенов в рублях для чат-бота: DeepSeek V4 Pro 60 ₽ терракотовым, Qwen 3.6 Plus 130 ₽, Claude Haiku 4.5 350 ₽, GPT-5.4 1070 ₽, Claude Opus 4.7 1790 ₽, GPT-5.5 2150 ₽, заголовок и подписи на русском

Как читать таблицу под типовые сценарии чат-бота:

  • Массовый бот поддержки, FAQ-бот, ассистент в Telegram с большим потоком. Берите дешёвый низ таблицы: DeepSeek V4 Pro, Qwen 3.6 Plus или GPT-5.4 Mini. На простых ответах качества хватает, а 60–320 ₽ за миллион выходных токенов держат счёт под контролем при тысячах диалогов.
  • Универсальный бот среднего качества. Claude Sonnet 4.6 и GPT-5.4 — рабочие лошадки: оба 1070 ₽ за миллион выхода, оба тянут связные диалоги, рассуждение и код среднего уровня. С них стоит начинать, если не уверены.
  • Сложный ассистент: код-помощник, агент с инструментами, юридический или аналитический бот. Сюда уже флагманы — Claude Opus 4.7, GPT-5.5 или Gemini 3.1 Pro. Платите за глубину только там, где она реально нужна.

Отдельно про DeepSeek V4 Pro: цена 30/60 ₽ — это промо-тариф со скидкой 75%, который действует до 2026-05-31. После окончания акции базовая ставка будет примерно вчетверо выше (около 120/240 ₽ за миллион). Если строите бота на нём — закладывайте базовую цену в расчёты заранее. Подробный разбор каждой флагманской модели — в статьях про GPT-5.5 API за рубли, а также на страницах ChatGPT API, Claude API и Gemini API.

Один код — любая модель: GPT, Claude, Gemini

Поскольку шлюз OpenAI-совместимый, gemini-чат-бот и бот на GPT — это один и тот же код с разным значением model. Можно даже маршрутизировать запросы по сложности: дешёвая модель на простое, флагман на сложное.

# Простой вопрос → дёшево
model = "deepseek/deepseek-v4-pro"

# Нужен сильный reasoning → флагман
model = "openai/gpt-5.5"

# Нужен мультимодал с аудио → Gemini
model = "google/gemini-3.1-pro-preview"

# Код вызова не меняется — только строка model
response = client.chat.completions.create(model=model, messages=history)
Enter fullscreen mode Exit fullscreen mode

Схема маршрутизации чат-бота по моделям: входящие запросы делятся ромбом «Сложность задачи?» на ветку 80 процентов к дешёвой модели DeepSeek и ветку 20 процентов к флагману GPT-5.5, подпись внизу «Один API, выбор модели параметром model», русские подписи

Telegram-бот на нейросети: рабочий пример

Telegram — самый частый транспорт для чат-бота в рунете: не нужно делать фронтенд, аудитория уже там, бесплатный хостинг диалогов. Соберём телеграм-бот на нейросети поверх кода выше. Понадобится библиотека python-telegram-bot и токен бота от @botfather:

pip install python-telegram-bot openai
Enter fullscreen mode Exit fullscreen mode
import os
from collections import defaultdict
from openai import OpenAI
from telegram import Update
from telegram.ext import (
 Application, CommandHandler, MessageHandler, filters, ContextTypes,
)

client = OpenAI(
 api_key=os.environ["LLM_API_KEY"],
 base_url="https://api.promptra.ru/v1",
)

SYSTEM_PROMPT = "Ты дружелюбный Telegram-ассистент. Отвечай кратко, по-русски."
MAX_TURNS = 10

# История по каждому чату отдельно: ключ — chat_id
histories: dict[int, list] = defaultdict(
 lambda: [{"role": "system", "content": SYSTEM_PROMPT}]
)

async def start(update: Update, ctx: ContextTypes.DEFAULT_TYPE):
 histories[update.effective_chat.id] = [
 {"role": "system", "content": SYSTEM_PROMPT}
 ]
 await update.message.reply_text("Привет! Я бот на нейросети. Спрашивай.")

async def on_message(update: Update, ctx: ContextTypes.DEFAULT_TYPE):
 chat_id = update.effective_chat.id
 history = histories[chat_id]
 history.append({"role": "user", "content": update.message.text})

 # Скользящее окно: системный промпт + последние пары
 trimmed = history[:1] + history[1:][-MAX_TURNS * 2 :]

 response = client.chat.completions.create(
 model="openai/gpt-5.4",
 messages=trimmed,
 temperature=0.6,
 )
 answer = response.choices[0].message.content
 history.append({"role": "assistant", "content": answer})
 await update.message.reply_text(answer)

def main:
 app = Application.builder.token(os.environ["TELEGRAM_TOKEN"]).build
 app.add_handler(CommandHandler("start", start))
 app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, on_message))
 app.run_polling

if __name__ == "__main__":
 main
Enter fullscreen mode Exit fullscreen mode

Запуск:

export TELEGRAM_TOKEN="123456:ABC-DEF..." # от @BotFather
export LLM_API_KEY="prm-xxxxxxxxxxxx" # из личного кабинета
python bot.py
Enter fullscreen mode Exit fullscreen mode

Это полноценный телеграм-бот с памятью на каждый чат: каждый пользователь ведёт свой диалог, бот помнит контекст в пределах последних десяти реплик. Ключевое отличие от консольной версии — словарь histories с ключом chat_id: у каждого собеседника своя история, они не смешиваются.

Схема Telegram-бота на нейросети: пользователь пишет в Telegram, бот на сервере хранит отдельную историю по chat_id, отправляет её в LLM API через шлюз и возвращает ответ в чат, русские подписи к блокам

Что добавить для продакшена:

  • Перенести историю в Redis. Словарь в памяти теряется при перезапуске и не масштабируется на несколько процессов. Redis с TTL на ключ решает оба вопроса.
  • Индикатор набора. await ctx.bot.send_chat_action(chat_id, "typing") перед запросом — пользователь видит «бот печатает».
  • Обработка ошибок и лимитов. Оборачивайте вызов API в try/except, на таймауте показывайте вежливое сообщение, логируйте response.usage для контроля расхода.
  • Webhook вместо polling. Для нагруженного бота run_webhook эффективнее, чем run_polling.

Сколько стоит чат-бот в месяц: прикидка

Посчитаем расход на реальном примере. Допустим, телеграм-бот поддержки обрабатывает 1000 диалогов в день, в среднем диалог — 6 реплик. Возьмём средний размер: вход (история + промпт) около 800 токенов на запрос, выход около 200 токенов.

На один диалог из 6 реплик: примерно 6 запросов × (800 вход + 200 выход) ≈ 4800 входных + 1200 выходных токенов. За день при 1000 диалогов — около 4.8 млн входных и 1.2 млн выходных токенов. За месяц (30 дней) — примерно 144 млн входных и 36 млн выходных.

Стоимость в месяц по каталожным ценам:

Модель Вход 144М Выход 36М Итого/мес
DeepSeek V4 Pro (промо) ~4 320 ₽ ~2 160 ₽ ~6 480 ₽
Qwen 3.6 Plus ~2 880 ₽ ~4 680 ₽ ~7 560 ₽
GPT-5.4 Mini ~7 200 ₽ ~11 520 ₽ ~18 720 ₽
GPT-5.4 / Sonnet 4.6 ~24 480 ₽ ~38 520 ₽ ~63 000 ₽

Цифры приблизительные — реальный расход зависит от длины ваших промптов и ответов, но порядок виден: на массовом боте выбор модели меняет счёт в десять раз. Для FAQ-бота берите дешёвый низ таблицы; флагман на таком потоке экономически не оправдан. Сократить вход помогает скользящее окно из раздела выше — без него история раздувается и счёт растёт.

К токенам добавляется сервисная комиссия 5% — она удерживается один раз при пополнении баланса (за работу сервиса, эквайринг, биллинг), а не с каждого токена. На сами цены токенов наценки нет: они один в один с провайдером по курсу ЦБ.

Оплата чат-бота на юрлицо в рублях

Для пет-проекта вопрос оплаты не стоит — пополнили баланс картой и работаете. Но если чат-бот — это рабочий инструмент компании или продукт с пользователями, расходы на LLM API нужно проводить по бухгалтерии. Прямой доступ к OpenAI, Anthropic и Google из России для этого не подходит: оплата идёт через зарубежные карты без нормальных закрывающих документов, а аккаунты нестабильны.

У нас оплата идёт на юрлицо — российское юр.лицо — в рублях, с полным пакетом первичных документов: договор-оферта, счёт, акт, счёт-фактура и УПД. Документооборот ведём через ЭДО (Диадок, СБИС), так что закрывающие попадают прямо в вашу учётную систему. Расходы на API чат-бота корректно учитываются как услуги, а не висят серой выплатой на сотруднике. Про юридическую сторону подробно — в статье Легально ли использовать OpenAI/Claude на юрлицо в РФ.

С технической стороны это ничего не меняет: тот же OpenAI-совместимый API, тот же код, одна строка base_url. Вы просто получаете предсказуемый доступ к моделям и нормальные документы для бухгалтерии.


Promptra — Russian LLM API aggregator. One OpenAI-compatible endpoint to all flagship models: OpenAI (GPT-5.5, GPT-5.4), Anthropic (Claude Opus 4.7, Sonnet 4.6), Google (Gemini 3.1 Pro, 3.5 Flash), DeepSeek V4 Pro, Qwen 3.6 Plus.

Provider prices 1-to-1 at CBR rate — no markup on tokens. Ruble billing per contract, full closing documents through EDI. No VPN — legal B2B service in Russia.

Try: promptra.ru · model catalog · docs

Top comments (0)