// за кулисами
Как это сделано
Весь проект - от первой строчки до рабочей ссылки - сделан за один сеанс в терминале с помощью AI-агента. Вот как это было.
// подход
Один сеанс - рабочий сервис
Я работал в Claude Code - это терминальный AI-агент от Anthropic (модель Claude Opus 4.6, high effort). Он не просто дополняет код - он сам читает файлы проекта, подключается к серверу, запускает команды, деплоит и чинит баги.
Моя роль - поставить задачу, дать контекст (ТЗ, доступы к серверу, стиль сайта), принимать решения на развилках и проверять результат в браузере. Весь код, настройка сервера, деплой - это сделал агент.
// процесс
Как шла работа
Я описал агенту задачу: ТЗ, адрес сервера, стиль портфолио, просьбу выйти за рамки задания. Дальше работали вместе - агент писал код и деплоил, я проверял результат в браузере, направлял и принимал решения на развилках.
Разведка
Агент одновременно сделал три вещи: разобрал код портфолио (какой фреймворк, какие стили, как устроен деплой), зашёл на сервер по SSH (посмотрел nginx, структуру папок) и скачал живой сайт, чтобы понять дизайн.
Поиск нейросети
Я дал ключ от Google Gemini - агент проверил, локально работает. Залил на сервер - а там блокировка: российский IP, доступ запрещён. Попробовал Groq - тоже заблокирован. Нашёл OpenRouter - это агрегатор, который работает из России и даёт доступ к 27 бесплатным нейросетям.
Написание кода
Агент за один шаг создал и страницу генератора, и серверную часть. Для страницы взял тот же фреймворк и стили, что и на портфолио - никаких новых зависимостей. Серверная часть - маленький Python-сервис, который принимает запрос и передаёт его нейросети.
Деплой на сервер
Агент собрал сайт, сжал файлы, загрузил на сервер. Потом создал виртуальное окружение для Python, установил зависимости, настроил автозапуск сервиса и подключил его к nginx. Всё через SSH прямо из терминала.
Тестирование и фиксы
Я открывал сайт, нажимал кнопки, писал что сломалось. Агент читал логи на сервере, находил причину и чинил. Несколько таких кругов - и всё заработало.
// таймлайн
30 минут от идеи до ссылки
Один сеанс в Claude Code. Вот что происходило по минутам:
// технологии
Что под капотом
Страница
- Astro 5 - тот же генератор сайтов, что и у портфолио
- Чистый JS - никаких фреймворков, страница весит минимум
- CSS-переменные - цвета и стили из основного сайта
Сервер
- FastAPI - маленький Python-сервис, принимает запросы и передаёт нейросети
- OpenRouter - агрегатор AI-моделей, 5 бесплатных нейросетей в пуле
- systemd - автоматический запуск и перезапуск при сбоях
Инфраструктура
- VPS на Debian - свой сервер в России
- Nginx - раздаёт статику и проксирует запросы к Python-сервису
- Let's Encrypt - бесплатный SSL-сертификат для HTTPS
Инструменты
- Claude Code (Opus 4.6, high effort) - AI-агент, который написал весь код
- rsync - загрузка файлов на сервер
- SSH - удалённое управление сервером
// архитектура
Путь запроса от кнопки до отмазки
Выбор ситуации
Пользователь выбирает готовую ситуацию или пишет свою. Выбирает тон: убедительный, драматичный, технический или абсурдный.
Запрос уходит на сервер
Браузер отправляет запрос на Python-сервис. Ключ от нейросети хранится только на сервере - пользователь его не видит.
Нейросеть генерирует отмазку
Сервис выбирает одну из 5 нейросетей (чтобы обойти ограничения бесплатного тира), отправляет ей ситуацию с инструкцией и получает в ответ текст отмазки, оценку правдоподобности и совет по подаче.
Результат в браузере
Отмазка появляется на экране с полоской правдоподобности. Можно скопировать, поделиться или попросить ещё одну. Все отмазки сохраняются в истории браузера.
// промпт
Как нейросеть понимает, что от неё хотят
Нейросети нельзя просто сказать «придумай отмазку» - нужна чёткая инструкция. Каждый запрос содержит системный промпт, который объясняет формат ответа, и пользовательское сообщение с ситуацией и тоном.
Системный промпт (отправляется с каждым запросом):
Придумай убедительную и креативную отмазку
для ситуации ниже.
Ответь ТОЛЬКО валидным JSON (без markdown,
без ```, без пояснений):
{"excuse": "отмазка 2-4 предложения на русском
с деталями", "rating": 7,
"tip": "совет по подаче 1 предложение"} Пользовательское сообщение (формируется из выбора):
Ситуация: Опоздал на работу Тон: драматичный
Ключевой момент - мы просим нейросеть ответить чистым JSON. Это позволяет программе автоматически разобрать ответ: вытащить текст отмазки, оценку и совет. Без этого пришлось бы вручную разбирать свободный текст.
Что происходит, если нейросеть ответила не по формату
Бесплатные модели не всегда слушаются. Вот что бывает и как мы это обрабатываем:
Ответ обёрнут в блок кода
Модель пишет ```json перед ответом. Парсер убирает эти обёртки
и достаёт чистый JSON изнутри.
Перед JSON идут рассуждения
Некоторые модели сначала «думают вслух», а потом выдают JSON.
Парсер ищет в тексте структуру с ключом "excuse" и вырезает только её.
Ответ лежит в неожиданном поле
Некоторые модели кладут результат не в основное поле ответа, а в поле «рассуждений». Сервис проверяет оба поля и берёт текст оттуда, где он есть.
Ничего не помогло
Если разобрать ответ не получилось - сервис пробует следующую нейросеть из пула. Всего 5 попыток, и каждый раз случайная модель. На практике хотя бы одна всегда отвечает нормально.
// выбор нейросети
Какую нейросеть использовать?
Нужен был бесплатный AI, который работает с российского сервера. Оказалось, что большинство популярных API заблокированы по геолокации. Единственный рабочий вариант - OpenRouter: он объединяет десятки нейросетей под одним интерфейсом, и 27 из них бесплатные.
OpenRouter
ВыбраноРаботает из России, 27 бесплатных моделей, одна точка входа
Google Gemini
ЗаблокированКлюч работал на компьютере, но сервер получал отказ
Groq
ЗаблокированТоже не пускает запросы с российских IP
Локальная нейросеть
Не потянетНа VPS с 2 ГБ памяти нейросеть не запустится
// грабли
С чем столкнулись и как решили
Проект делался в реальном времени, поэтому проблемы решались на ходу. Вот четыре, на которые ушло больше всего времени.
Нейросети не отвечают с российского сервера
Google Gemini и Groq отказывали в доступе - определяли, что запрос идёт из России, и блокировали. Ключ при этом был рабочий. Пришлось искать альтернативу - ей стал OpenRouter, который не блокирует по географии.
Нейросети отвечают в разных форматах
Одна модель возвращает чистый текст, другая оборачивает ответ в блок кода, третья вообще кладёт результат в неожиданное поле. Написали парсер, который ищет нужную структуру в ответе независимо от формата.
Ограничения бесплатного тира
Каждая бесплатная модель разрешает ~20 запросов в минуту. При активном тестировании лимит быстро исчерпывается. Решение: подключили 5 нейросетей от разных компаний. Запросы распределяются между ними случайным образом - если одна перегружена, автоматически используется следующая.
Конфликт файлов при деплое
Astro создавал файл и папку с одинаковым названием, и nginx не мог определить, что показывать. Страница выдавала ошибку. Добавили шаг в скрипт деплоя, который копирует файл внутрь папки - проблема ушла.
// решения
Почему именно так
Astro, а не React
Портфолио уже на Astro - логичнее использовать тот же инструмент, чем тащить новый фреймворк. Страница открывается мгновенно, потому что это обычный HTML.
Отдельный Python-сервис
Можно было бы встроить генерацию прямо в сайт, но тогда пришлось бы менять весь процесс деплоя. Маленький отдельный сервис ничего не ломает и легко обновляется.
5 моделей вместо одной
Бесплатные нейросети ненадёжны по отдельности - то лимиты, то странный формат ответа. Пять моделей с автопереключением работают стабильно.
systemd вместо Docker
Для одного Python-файла Docker избыточен. Обычный системный сервис: запускается автоматически, перезапускается при сбое, логи всегда под рукой.
// сверх ТЗ
Что добавлено поверх задания
Свои ситуации
В ТЗ - три ситуации на выбор. Я добавил ещё три готовых и возможность написать любую свою.
Выбор тона
Убедительный, драматичный, технический или абсурдный - каждый даёт совершенно другой стиль отмазки.
Советы по подаче
К каждой отмазке - короткий совет, как лучше её преподнести, чтобы звучало убедительнее.
История
Все отмазки сохраняются в браузере. Можно вернуться к удачной и скопировать её позже.
Кнопка «Поделиться»
На телефоне открывает системное меню отправки. На компьютере - копирует текст.
Прогресс и модель
Видно сколько секунд идёт генерация и какая именно нейросеть придумала отмазку.