Простой AI чат бот на Python

Знакомо чувство, когда хотите понять работу ИИ-ассистента, но все туториалы предлагают подключить десяток библиотек и получить готовую коробку? LangChain, LlamaIndex, AutoGen — мощные инструменты, но они скрывают самое интересное: как на самом деле происходит диалог между кодом и языковой моделью.

А ведь принцип на удивление простой: отправил список сообщений — получил ответ. Всё. Серьёзно. Давайте построим чат-бота с нуля за минуту и разберёмся, что происходит за кулисами каждого AI-ассистента.

Что мы получим в итоге?

Консольный чат-бот, который:

  • Подключается к OpenRouter API
  • Поддерживает контекст диалога — бот помнит что вы говорили ранее
  • Работает в реальном времени в терминале
  • Написан на чистом Python с минимальными зависимостями

Прежде чем писать код, нужно получить две вещи:

Ключ API от OpenRouter. Зайдите на https://openrouter.ai, создайте аккаунт и сгенерируйте API-ключ. Для начала подойдёт бесплатная модель — никакой кредитной карты не нужно.

Файл `.env` для хранения ключа. Создайте в корне проекта файл `.env` и добавьте туда:

OPENROUTER_API_KEY=ваш_ключ

Код чат бота

Импорт и настройка

import os, requests, json
import dotenv

dotenv.load_dotenv()

url = "https://openrouter.ai/api/v1/chat/completions"
api_key = os.getenv("OPENROUTER_API_KEY")
model_name = "openrouter/free"

Здесь мы загружаем переменные окружения из .env файла. dotenv — единственная внешняя зависимость нашего проекта, и она нужна только для удобства: чтобы не хранить секреты прямо в коде.

Адрес url указывает на стандартный OpenAI-совместимый API. Почти все современные LLM-провайдеры используют одинаковый формат запросов — это значит что наш бот легко адаптировать для OpenAI, Anthropic или любых других моделей.

Управление контекстом диалога

class Context:
    
    def __init__(self):
        self.prompt = []
    
    def add(self, role, message):
        self.prompt.append({"role": role, "content": message})

Это самая важная часть кода. Языковые модели не «помнят» предыдущие сообщения — они получают на вход весь список сообщений целиком при каждом запросе. Поэтому мы храним всю историю диалога в списке self.prompt.

Каждое сообщение состоит из двух частей: роль (`system`, `user`, `assistant`) и текст. Системное сообщение задаёт поведение бота, сообщения пользователя — вопросы, ответы ассистента — его реакции.

Отправка запроса к модели

def send_to_llm(context):
    
    data = {
        "model": model_name,
        "messages": context.prompt
    }
    headers = {
        "Authorization": "Bearer " + api_key
    }
    
    response = requests.post(url,
        headers=headers, data=json.dumps(data)
    )
    response.raise_for_status()
    result = response.json()
    
    return result["choices"][0]["message"]["content"]

requests.post отправляет POST-запрос с JSON-данными на адрес API. В ответе модель возвращает JSON, из которого нам нужен только текст — result["choices"][0]["message"]["content"].

Обратите внимание на response.raise_for_status() — это проверка на ошибки. Если API вернёт ошибку (неверный ключ, лимит запросов), код остановится с понятным сообщением, а не будет молча глючить.

Основной цикл общения

context = Context()
context.add("system", "Ты помощник для программистов")

print("Введите запрос")

while True:
    
    print("> ", end="")
    query = input().strip()
    
    if query == "":
        continue
    
    if query.lower() in ["q", "quit"]:
        break
    
    context.add("user", query)

    answer = send_to_llm(context)
    print(answer)

    context.add("assistant", answer)

Простой бесконечный цикл: считали ввод → добавил в контекст → отправили модели → вывели ответ → добавили ответ в контекст. Обратите внимание что мы добавляем и вопрос, и ответ — так модель «видит» всю переписку при следующем запросе.

Небольшой нюанс: модель не имеет собственной памяти. Каждый раз ей заново отправляется вся история диалога. На длинных беседах это может стать дорогим — но для начала это идеальный подход.

Почему это работает лучше, чем кажется

Многие думают что для создания AI-бота нужна сложная инфраструктура. Но на деле формат диалога стандартен — одинаков для GPT, Claude, Llama и десятков других моделей. Освоив этот паттерн, вы поймете принцип работы любого AI-ассистента: это просто функция, которая принимает список сообщений и возвращает новое.

Вот что уже можете делать с этим кодом:

  • Менять model_name на любую доступную в OpenRouter модель — от бесплатных до самых мощных
  • Изменять системное сообщение, чтобы бот стал программистом, копирайтером или тренером
  • Сохранять историю диалога в файл и продолжать беседу позже

Итог

Простой AI чат-бот на Python — это не учебный проект на вечер, а фундамент для понимания того как работают современные ИИ-ассистенты. Буквально несколько строк кода, одна внешняя библиотека и бесплатный API-ключ — и получаете работающего бота с контекстом диалога.

Главный вывод: за каждой «магией» AI скрывается обычный HTTP-запрос. Модель не «думает» и не «понимает» — она предсказывает следующее слово на основе списка сообщений, которые ей отправляете. Понимание этого принципа — ключ к созданию любых AI-инструментов, от простых ботов до сложных агентных систем.

Попробуйте запустить этот код, поэкспериментируйте с системными сообщениями и моделями. А потом спросите себя: а что если добавить боту доступ к базе данных? Вопросы важнее готовых ответов.

Дата публикации: 15 Июля 2026