Перейти к содержимому
← Генератор Главная →

// за кулисами

Как это сделано

Весь проект - от первой строчки до рабочей ссылки - сделан за один сеанс в терминале с помощью AI-агента. Вот как это было.

// подход

Один сеанс - рабочий сервис

Я работал в Claude Code - это терминальный AI-агент от Anthropic (модель Claude Opus 4.6, high effort). Он не просто дополняет код - он сам читает файлы проекта, подключается к серверу, запускает команды, деплоит и чинит баги.

Моя роль - поставить задачу, дать контекст (ТЗ, доступы к серверу, стиль сайта), принимать решения на развилках и проверять результат в браузере. Весь код, настройка сервера, деплой - это сделал агент.

// процесс

Как шла работа

Я описал агенту задачу: ТЗ, адрес сервера, стиль портфолио, просьбу выйти за рамки задания. Дальше работали вместе - агент писал код и деплоил, я проверял результат в браузере, направлял и принимал решения на развилках.

01

Разведка

Агент одновременно сделал три вещи: разобрал код портфолио (какой фреймворк, какие стили, как устроен деплой), зашёл на сервер по SSH (посмотрел nginx, структуру папок) и скачал живой сайт, чтобы понять дизайн.

02

Поиск нейросети

Я дал ключ от Google Gemini - агент проверил, локально работает. Залил на сервер - а там блокировка: российский IP, доступ запрещён. Попробовал Groq - тоже заблокирован. Нашёл OpenRouter - это агрегатор, который работает из России и даёт доступ к 27 бесплатным нейросетям.

03

Написание кода

Агент за один шаг создал и страницу генератора, и серверную часть. Для страницы взял тот же фреймворк и стили, что и на портфолио - никаких новых зависимостей. Серверная часть - маленький Python-сервис, который принимает запрос и передаёт его нейросети.

04

Деплой на сервер

Агент собрал сайт, сжал файлы, загрузил на сервер. Потом создал виртуальное окружение для Python, установил зависимости, настроил автозапуск сервиса и подключил его к nginx. Всё через SSH прямо из терминала.

05

Тестирование и фиксы

Я открывал сайт, нажимал кнопки, писал что сломалось. Агент читал логи на сервере, находил причину и чинил. Несколько таких кругов - и всё заработало.

// таймлайн

30 минут от идеи до ссылки

Один сеанс в Claude Code. Вот что происходило по минутам:

0 мин
Отправил ТЗ - агент начал изучать проект, сервер и живой сайт одновременно
~3 мин
Агент понял как устроен сайт. Проверил ключ Gemini - работает
~5 мин
Написал страницу генератора и серверную часть. Сайт собрался без ошибок
~8 мин
Первый деплой. Страница открывается, но генерация не работает - Gemini заблокирован на сервере
~12 мин
Перепробовал API по очереди прямо с сервера. Нашёл OpenRouter - переключил бэкенд
~15 мин
Первая отмазка успешно сгенерирована через всю цепочку: браузер → сервер → нейросеть → ответ
~20 мин
Починил нестабильные ответы нейросетей. Добавил 5 моделей с автопереключением
~30 мин
Добавил индикатор загрузки, показ модели, эту страницу. Финальный деплой

// технологии

Что под капотом

Страница

  • 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 - удалённое управление сервером

// архитектура

Путь запроса от кнопки до отмазки

01

Выбор ситуации

Пользователь выбирает готовую ситуацию или пишет свою. Выбирает тон: убедительный, драматичный, технический или абсурдный.

02

Запрос уходит на сервер

Браузер отправляет запрос на Python-сервис. Ключ от нейросети хранится только на сервере - пользователь его не видит.

03

Нейросеть генерирует отмазку

Сервис выбирает одну из 5 нейросетей (чтобы обойти ограничения бесплатного тира), отправляет ей ситуацию с инструкцией и получает в ответ текст отмазки, оценку правдоподобности и совет по подаче.

04

Результат в браузере

Отмазка появляется на экране с полоской правдоподобности. Можно скопировать, поделиться или попросить ещё одну. Все отмазки сохраняются в истории браузера.

// промпт

Как нейросеть понимает, что от неё хотят

Нейросети нельзя просто сказать «придумай отмазку» - нужна чёткая инструкция. Каждый запрос содержит системный промпт, который объясняет формат ответа, и пользовательское сообщение с ситуацией и тоном.

Системный промпт (отправляется с каждым запросом):

Придумай убедительную и креативную отмазку
для ситуации ниже.

Ответь ТОЛЬКО валидным JSON (без markdown,
без ```, без пояснений):
{"excuse": "отмазка 2-4 предложения на русском
с деталями", "rating": 7,
"tip": "совет по подаче 1 предложение"}

Пользовательское сообщение (формируется из выбора):

Ситуация: Опоздал на работу
Тон: драматичный

Ключевой момент - мы просим нейросеть ответить чистым JSON. Это позволяет программе автоматически разобрать ответ: вытащить текст отмазки, оценку и совет. Без этого пришлось бы вручную разбирать свободный текст.

Что происходит, если нейросеть ответила не по формату

Бесплатные модели не всегда слушаются. Вот что бывает и как мы это обрабатываем:

1

Ответ обёрнут в блок кода

Модель пишет ```json перед ответом. Парсер убирает эти обёртки и достаёт чистый JSON изнутри.

2

Перед JSON идут рассуждения

Некоторые модели сначала «думают вслух», а потом выдают JSON. Парсер ищет в тексте структуру с ключом "excuse" и вырезает только её.

3

Ответ лежит в неожиданном поле

Некоторые модели кладут результат не в основное поле ответа, а в поле «рассуждений». Сервис проверяет оба поля и берёт текст оттуда, где он есть.

4

Ничего не помогло

Если разобрать ответ не получилось - сервис пробует следующую нейросеть из пула. Всего 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 избыточен. Обычный системный сервис: запускается автоматически, перезапускается при сбое, логи всегда под рукой.

// сверх ТЗ

Что добавлено поверх задания

Свои ситуации

В ТЗ - три ситуации на выбор. Я добавил ещё три готовых и возможность написать любую свою.

Выбор тона

Убедительный, драматичный, технический или абсурдный - каждый даёт совершенно другой стиль отмазки.

Советы по подаче

К каждой отмазке - короткий совет, как лучше её преподнести, чтобы звучало убедительнее.

История

Все отмазки сохраняются в браузере. Можно вернуться к удачной и скопировать её позже.

Кнопка «Поделиться»

На телефоне открывает системное меню отправки. На компьютере - копирует текст.

Прогресс и модель

Видно сколько секунд идёт генерация и какая именно нейросеть придумала отмазку.