Заказчик - компания-поставщик LED-экранов: подбор, поставка и монтаж экранов для бизнеса. Сайт сделан на Tilda, его ведёт свой разработчик, заявки с сайта обрабатывают менеджеры.
Нужны были две новые функции сайта, которые работают без участия людей.
Первая - чат-бот. Отвечает посетителям на трёх языках, включая язык с письмом справа налево. Если ответ есть в базе знаний, выдаёт его. На свободные вопросы отвечает нейросеть по материалам компании. Если ответа нет или человек просит менеджера, бот собирает контакт и передаёт диалог менеджерам в Telegram.
Вторая - визуализация. Посетитель загружает рекламный макет и получает фото, где этот макет стоит на LED-экране в городской сцене, с перспективой, светом и тенями. Если результат слабый, сервис сам переделывает его и только потом просит другой макет.
Главное требование: модель ИИ должна меняться настройкой, а не правкой кода. Все обращения к моделям идут через шлюз Cloudflare AI Gateway. Фронтенд сайта делает разработчик заказчика, от меня - REST API, документация, готовые блоки для Tilda и демо-страницы. Один сервер, проект с нуля, бюджет фиксированный.
Сделал два независимых сервиса на Python и FastAPI с REST API, оба работают на одном сервере.
Чат-бот. База знаний - 110 пар «вопрос-ответ» на трёх языках из текстов сайта и подтверждённых ответов заказчика. Поиск по смыслу: эмбеддинги OpenAI и векторный поиск pgvector в PostgreSQL. Похожий вопрос получает готовый ответ из базы мгновенно, без вызова модели, но только при высоком совпадении и на языке вопроса, иначе бот ответил бы на чужом языке. На свободные вопросы отвечает Claude Sonnet 4.6 по найденным фрагментам, профилю компании и истории диалога. Модель возвращает строгий JSON и сама решает, когда звать менеджера; сломанный JSON до посетителя не доходит. Тема ограничена компанией, инструкции из сообщений посетителя игнорируются. Если нужен человек, бот просит имя и контакт и отправляет заявку с историей диалога в Telegram-группу менеджеров. После сдачи по просьбе заказчика добавил приглашение оставить контакт под каждым ответом: контакт ловится в любой момент, но по строгим правилам, чтобы цены, даты и размеры в вопросе не стали «телефоном».
Визуализация. Сначала геометрия: OpenCV вписывает макет в LED-зону сцены по 4 размеченным точкам, перспектива всегда точная и без ИИ. Затем нейросеть FLUX Kontext Pro встраивает его в сцену: свет, отсвет экрана, отражения, мягкие тени, сам макет менять запрещено. Потом Claude со зрением проверяет результат: резкость, читаемость текста и логотипа, артефакты, перспективу, не подменено ли содержимое. При браке генерация повторяется с замечаниями проверки в промпте, до 3 повторов. Посетитель получает превью и PNG 2048x1136.
Модели и панель. Нейросети подключены через 9 адаптеров к 4 типам задач на чистом HTTP, без SDK провайдеров. В панели администратора провайдер и модель выбираются отдельно для ответов, эмбеддингов, визуализации и проверки качества, смена применяется за 10 секунд без перезапуска. Расход на ИИ считается по каждому платному вызову. Все вызовы идут через Cloudflare AI Gateway: ключи провайдеров хранятся в Cloudflare, на сервере их нет; тесты проверяют, что ключ провайдера не уходит в запросе.
Сайт. Два готовых блока для Tilda на чистом JavaScript: чат-виджет с тремя языками и мобильной вёрсткой и форма визуализации с проверкой файла, превью и скачиванием. Плюс инструкция и Swagger для разработчика сайта. DNS-зону перенёс на Cloudflare: в DNS Tilda нельзя завести A-записи для поддоменов API.
Инфраструктура. Docker Compose, 5 контейнеров: бот, визуализация, PostgreSQL с pgvector, Redis и Caddy с сертификатами Let's Encrypt. CI/CD на GitHub Actions: ruff и pytest с настоящими PostgreSQL и Redis, сборка образа и передача на сервер потоком по SSH без реестра; стек перезапускается только после полной загрузки образа. Защита API и бюджета на ИИ: ключ доступа, CORS, ограничение частоты запросов и количества генераций. После сдачи передал репозиторий и пайплайн на аккаунт заказчика.
Оба сервиса работают на сайте заказчика с сентября 2026, после сдачи идёт сопровождение.
Разовые замеры на боевом сервере по живым моделям: ответ из базы знаний 0,2-0,4 с, ответ модели 3,3-7,4 с, генерация визуализации целиком 14-23 с.
Проверка качества работает как фильтр: бессмысленный тестовый макет получал оценку 0,10-0,30 и браковался во всех попытках, реалистичный рекламный макет прошёл с первой попытки с оценкой 0,95. По прайсу провайдеров попытка генерации стоит около $0,045, в худшем случае с тремя повторами до $0,18.
Заказчик сам переключает модели в панели и видит расход на ИИ, ключей провайдеров на сервере нет. Выкатка от пуша до перезапуска занимает около 2 минут и идёт только после зелёных тестов.
Объём: 2829 строк Python в 56 файлах, 102 автотеста (62 unit и 40 e2e с настоящими PostgreSQL и Redis), 1045 строк HTML и JavaScript в блоках для Tilda и демо-страницах, инструкция для разработчика сайта и инструкция по эксплуатации.
Публичной ссылки нет: сервисы работают на сайте заказчика, кейс обезличен, кадры сняты на демо-данных.