Гендок · демо к отклику

Как я это сделаю

План рабочей версии на стеке из ТЗ: Laravel 12, Filament, PostgreSQL 16, Redis и Horizon, PhpWord и Gotenberg. Демо в соседних вкладках показывает поведение, здесь — из чего оно будет собрано.

Из чего состоит сервис

Нажмите на блок, чтобы прочитать, что он делает.

Сайт и мастер документа Blade · чистый JS · SCSS по БЭМ
Главная, каталог, страницы ситуаций, мастер, кабинет. Страницы отдаёт сервер, поэтому каталог индексируется поисковиками. JS только там, где он нужен: анкета, правка документа, опрос статуса генерации.
▼
Laravel 12 ядро + модуль «Гендок»
Ядро (пользователи, оплаты, ИИ-слой, уведомления, админка) отделено от модуля сервиса (ситуации, анкеты, шаблоны, дела). Следующий сервис заказчика добавляется как ещё один модуль на том же ядре и в той же админке.
▼
Redis + Horizon очереди ai · docs · notify
Запросы к ИИ, сборка файлов и рассылка идут через очереди. Страница не ждёт ответа модели 20 секунд, а опрашивает статус задачи: если основная модель молчит, сайт не зависает и не теряет других посетителей.
▼
ИИ-слой единый интерфейс драйверов
Один контракт AiDriver и менеджер цепочки. Порядок моделей, таймауты, число повторов и цены токенов лежат в базе и правятся в админке. Каждая попытка пишется в журнал: модель, время, токены, стоимость, причина сбоя.
Документы PhpWord → Gotenberg
Шаблон — обычный DOCX с переменными и условными блоками, его готовит юрист в Word и загружает в админку. PhpWord подставляет данные, Gotenberg (LibreOffice в Docker) делает PDF из того же файла, поэтому PDF совпадает с DOCX до строки.
YandexGPT основная
Первая в цепочке. Ключи на аккаунте заказчика, данные обрабатываются в РФ.
GigaChat вторая
Подключается, если первая не ответила за 20 секунд или вернула ошибку. Токен доступа обновляется по расписанию.
Резерв OpenAI-совместимый API
Третья линия. Один драйвер на любой сервис с совместимым API: адрес и ключ задаются в админке.
▼
PostgreSQL 16 данные в РФ
Ситуации, анкеты, версии шаблонов и промптов, дела, документы, события, платежи, журнал ИИ. Ответы анкеты с персональными данными шифруются на уровне полей.
Scheduler сроки и напоминания
Раз в 10 минут ищет дела, у которых подошёл контрольный срок, и ставит письма и сообщения в очередь. Рабочие дни считаются по производственному календарю.
▼
E-mail код входа · напоминания
Вход по коду из письма, напоминания о сроке, ссылка на следующий шаг.
Telegram-бот вход · напоминания
Вход через бота и кнопки «Ответ пришёл» / «Не пришёл» прямо в сообщении.
ЮKassa карта · СБП
Разовая покупка и подписка. Вебхук обрабатывается один раз по ключу идемпотентности: повторное уведомление не выдаст документ дважды и не продлит подписку лишний раз.
▲
Админка на Filament общая для будущих сервисов
Ситуации, анкеты, шаблоны, промпты, модели ИИ, тарифы, пользователи, дела, журнал запросов, SEO-поля. У шаблонов и промптов есть версии: можно откатиться, а в каждом документе записано, какой версией он собран.

Путь одного документа

  1. Текст ситуацииЗадача уходит в очередь, страница показывает ход
    0,1 с
  2. Тип ситуации и фактыОдин запрос к ИИ, ответ строго по JSON-схеме: ситуация, уверенность, найденные суммы и даты
    1–3 с
  3. Анкета из 5–10 вопросовНайденное в тексте уже подставлено, человек проверяет и дополняет
    1–2 мин
  4. Текст обстоятельствИИ пишет только описательную часть. ФИО, адреса и телефоны в модель не уходят: их подставляет шаблон
    2–5 с
  5. Сборка DOCX и проверка реквизитовPhpWord, условные блоки, список незаполненного
    0,2 с
  6. PDFGotenberg из того же DOCX
    1–2 с
  7. Дело и контрольный срокНапоминания встают в расписание, следующий шаг известен заранее
    сразу

Если основная модель не ответила

нет ответа 20 сЗапрос обрывается, та же задача сразу уходит следующей модели по приоритету. Повторять на той же модели нет смысла: человек уже ждал.
ошибка 5xx / 429Один быстрый повтор через 1–2 секунды, затем следующая модель.
ответ не по схемеОтвет проверяется по JSON-схеме. Один повтор с просьбой исправить формат, затем следующая модель.
предохранительТри сбоя подряд — модель на 5 минут исключается из цепочки, чтобы каждый посетитель не терял на ней по 20 секунд. Потом пробный запрос.
не ответил никтоСитуацию человек выбирает из каталога, документ собирается по шаблону без текста ИИ. Задача остаётся в очереди, улучшенный текст придёт на почту.
журналКаждая попытка — строка: модель, номер попытки, время, токены, стоимость, ошибка. Расход виден по дням, моделям и задачам.

Это можно проверить прямо здесь: включите «Сломать основную модель ИИ» вверху и соберите документ, потом откройте «Админка → Журнал ИИ».

Данные и деньги

situationsСитуация, тип документа, контрольный срок, следующий шаг, SEO-поля, адрес страницы.
questionsВопросы анкеты: тип, обязательность, признак «персональные данные», условие показа.
templates · versionsDOCX-шаблоны с версиями. Документ помнит, какой версией собран.
prompts · versionsПромпты и схемы ответов, тоже с версиями и откатом.
cases · documents · eventsДело, его документы и лента событий: создано, отправлено, срок, ответ, следующий шаг.
ai_providers · ai_requestsЦепочка моделей и журнал каждой попытки со стоимостью.
payments · subscriptionsПлатёж с ключом идемпотентности, подписка, бесплатные лимиты.

Что заложено на годы

Этапы и цена

1. Каркас: сервер, база, базовая админка, вход по кодудни 1–324 000 ₽
2. Ядро: ИИ-слой с резервом, мастер, DOCX и PDFдни 4–842 000 ₽
3. Кабинет: дела и сроки, e-mail и Telegram, ЮKassaдни 9–1236 000 ₽
4. Сдача: SEO-страницы, тесты, исправления, документациядни 13–1418 000 ₽

Итого 120 000 ₽ за 14 дней. Подробности по каждому этапу и критерии приёмки — в разделе «ТЗ и смета».