Привет! Меня зовут Виктор. Я умею продвигать сайты, монтировать видео и настраивать рекламу, но слово asyncio еще два месяца назад вызывало у меня паническую атаку.
Идея родилась случайно: друг-маркетолог предложил сделать кулинарного бота. Ниша понятная, аудитория огромная, кейс для портфолио красивый. Я согласился при одном условии: я не будКак я создал кулинарного Telegram-бота за 1.5 месяца без знания программирования (с помощью Claude и ChatGPT)
у учить Python. Я буду управлять тем, кто его знает — Искусственным Интеллектом.
Спойлер: так появился «ШефБот», и это оказалось сложнее, чем просто жать Ctrl+C / Ctrl+V.
🛠 Выбор стека: почему AI выбрал это?
Я просто спросил у ChatGPT: "Как сделать бота?". Он предложил Python. В итоге стек собрался такой:
Язык: Python 3.11 (потому что AI его знает лучше всего).
Фреймворк: aiogram 3.x. Изначально GPT подсунул старый python-telegram-bot, но Claude вовремя переубедил меня, пояснив за асинхронность.
AI-мозги: OpenAI API (GPT-4o mini) + Gemini Vision (для фото) + Whisper (для голоса).
База: aiosqlite (для MVP хватает с головой).
Деплой: Docker (чтобы не сойти с ума с зависимостями).
Совет новичкам: Если вы в РФ, OpenAI API напрямую не работает. Я использую прокси-сервис (например, AITunnel), который дает доступ к GPT и Claude через российский endpoint. Это спасает от танцев с VPN на сервере.
🧠 Архитектура: Хаос, ставший порядком
Спустя месяц папка проекта эволюционировала из свалки скриптов в структуру, которой я (и мой AI-архитектор Claude) гордимся:
Plaintext
chef_bot/
├── handlers/ # "Руки" бота: обработка команд, фото, голоса
├── services/ # "Мозги": запросы к AI, Vision, логика рецептов
├── database/ # Память (SQLite)
├── utils/ # Инструменты (логгер, валидаторы)
├── bot.py # Точка входа
└── docker-compose.yml # Чтобы работало везде
🔥 Killer-фичи и как мы их кодили
1. "Что в холодильнике?" (Vision API)
Самая эффектная фича. Кидаешь боту фото — он говорит, что приготовить.
Проблема была в том, что отправлять 5МБ фото в API — дорого и долго.
Решение от Claude: Сжимать фото перед отправкой до 512x512. Качество распознавания продуктов не падает, а трафик экономится в 10 раз.
Логика (псевдокод):
Python
# Промпт для Vision модели VISION_PROMPT = """ Проанализируй фото. Верни JSON: { "products": [{"name": "название", "qty": "~200г"}], "total_items": int } Игнорируй посуду, кота и мебель. Только еда. """ async def recognize_food(photo): compressed_img = compress_image(photo) # Сжали response = await gemini_client.ask(VISION_PROMPT, compressed_img) return json.loads(response)
2. Защита от веганов (Промпт-инжиниринг)
Самая большая боль — заставить AI действительно соблюдать диеты. Если просто написать "Ты веган-повар", он все равно может предложить посыпать салат сыром.
Как мы это победили:
- Жесткий System Prompt: Прописали не "чего нельзя", а "НА ЧТО ЗАМЕНИТЬ".
- Валидация на клиенте: Python-скрипт проверяет ответ нейронки на "стоп-слова" перед отправкой пользователю.
Python
# Фрагмент валидатора FORBIDDEN = {'vegan': ['мясо', 'яйцо', 'молоко', 'мёд']} def check_diet(recipe_text, diet_type): for product in FORBIDDEN[diet_type]: if product in recipe_text.lower(): # Но! Исключаем ложные срабатывания типа "соевое мясо" if not is_vegan_alternative(product, recipe_text): return False, f"Обнаружен запрещенный продукт: {product}" return True, "OK"
3. Прогрессивная сложность
Чтобы бот не был скучным, мы внедрили "уровни".
- Пользователь просит "еще вариант" -> Уровень сложности растет -> temperature (креативность) модели повышается.
- Итог: Сначала бот предлагает яичницу, а с 5-й попытки — яйца-пашот с трюфельным маслом.
rake: Главные грабли разработки
Грабля №1: Markdown и Telegram
Telegram очень капризен к разметке. Если нейросеть вернет незакрытую звездочку * или лишнюю скобку в Markdown, бот просто упадет с ошибкой Can't parse entities.
Решение: Я запретил нейросети использовать Markdown. Вообще.
В промпте прописано: "Используй только эмодзи и plain text. Заголовки выделяй CAPS LOCK или эмодзи 🥘. Никаких звездочек!"
Грабля №2: "Амнезия" у бота
Пользователь жал кнопку "Сгенерируй рецепт", а бот отвечал: "Эм, а из чего?". Переменные терялись при перезапуске бота или обновлении кода.
Решение: Перестать хранить состояние в оперативной памяти (dict) и начать писать всё в БД или хотя бы использовать FSM (Finite State Machine) в aiogram. Claude объяснил мне концепцию стейтов за 10 минут.
Грабля №3: Болтливые пользователи
Люди писали боту: "Привет, как дела?", "Напиши код на Python". Бот честно тратил мои деньги, пытаясь поддержать беседу через API GPT-4.
Решение: Валидация "на входе".
Python
# Если в тексте нет названий еды - даже не дергаем AI if not contains_food_keywords(user_message): await msg.answer("Я понимаю только язык еды 🥕. Пришлите список продуктов!") return
💸 Telegram Stars и Монетизация
Я решил сразу тестировать новую фичу Павла Дурова — Telegram Stars.
Модель: Freemium.
- Бесплатно: 3 фото/день, базовые рецепты.
- Премиум (50 Stars ≈ 99₽): безлимит, диеты, голосовой ввод.
Интеграция оказалась на удивление простой. Самое сложное было дождаться аппрува от BotSupport (заняло 1.5 недели).
Код оплаты (сокращенно):
Python
@router.callback_query(F.data == "buy_premium")
async def send_invoice(call: CallbackQuery):
await call.message.answer_invoice(
title="🌟 ШефБот Премиум",
description="Диеты, голос и безлимитные фото",
payload="internal_trans_id",
currency="XTR", # Код валюты Stars
prices=[LabeledPrice(label="30 дней", amount=50)]
)
💰 Цена вопроса (Честный P&L)
Потрачено за 1.5 месяца:
1. Сервер (VPS) - 1500₽ / мес (Крутится 4 моих проекта)
2. Доступ к AI (AITunnel) - ~300₽ (Пока трафик небольшой)
3. Разработка - 0₽ (60 часов моего времени)
4. Нервы - Бесценно (Когда бот упал в 2 ночи)
🏆 Выводы: Заменит ли AI программистов?
Нет. Но он позволит непрограммистам создавать продукты.
Я был архитектором, продакт-менеджером и тестировщиком. AI был «джуном-кодером», который пишет быстро, но иногда бредит.
Моя работа заключалась не в написании def function():, а в формулировании задач:
❌ "Сделай чтобы работало"
✅ "Напиши функцию валидации текста на Python, которая ищет слова из списка forbidden_list и возвращает bool. Добавь логирование ошибок."
Совет тем, кто хочет повторить:
Начинайте с Claude 3.5 Sonnet. Для кодинга он сейчас объективно лучше GPT-4o. Он лучше держит контекст и пишет меньше багов.
P.S. Сейчас ШефБот умеет придумывать рецепты, а я — придумывать новые фичи. Если статья зайдет, в следующей части расскажу, как я прикручиваю к нему реферальную систему и генерацию картинок готовых блюд.
Попробуйте бота оценить сами: https://t.me/best_cooking_bot