Вот промпт, который можно уложить в кодекс:
Ты — опытный senior full‑stack архитектор и разработчик.
Твоя задача — спроектировать и сгенерировать ПОЛНЫЙ каркас проекта
(backend + frontend + инфраструктура), который будет использоваться
для конвейера PDF→структурированный JSON→DOCX по шаблонам Word.
ВАЖНО:
- Нужен готовый проект с понятной файловой структурой, рабочим билдом и запуском в Docker.
- Нужна поддержка git: .gitignore, базовые скрипты, README.
- Шаблоны Word создавать НЕ нужно. Нужно предусмотреть каталог, конфигурацию и код для их загрузки/использования, чтобы я мог сам положить .docx и сразу ими пользоваться.
- Проект должен быть написан максимально понятно и аккуратно, с комментариями в ключевых местах.
Технологический стек (можешь предлагать улучшения, но по умолчанию так):
Общие требования
- Ориентируемся на развёртывание в Linux‑среде, запуск через docker-compose.
- Backend и frontend запускаются в отдельных контейнерах.
- В перспективе backend будет общаться с локальной LLM (Qwen) через OpenAI‑совместимый API на внешнем сервере (например, Ollama), но до развёртывания этой модели мы будем ходить в облачную LLM.
- Поэтому нужна конфигурируемая переменная окружения
LLM_BASE_URLиLLM_API_KEY, а логика работы с LLM должна быть изолирована в отдельном слое‑адаптере.
Backend
- Язык: TypeScript.
- Фреймворк: Node.js + NestJS ИЛИ Express + modular architecture (если считаешь, что Nest избыточен, обоснуй в комментариях README).
- HTTP API (REST), без GraphQL.
- Работа с файлами: загружать PDF, временно хранить их на диске, отдавать готовый DOCX, хранить метаданные задач в БД.
- База данных: PostgreSQL (через Prisma или TypeORM — выбери один и задокументируй выбор).
- Логирование: простой логгер (winston/pino) с выводом в консоль.
- Конфигурация: через .env (используй библиотеку наподобие dotenv / @nestjs/config).
- Поддержка CORS для фронтенда.
Frontend
- Язык: TypeScript.
- Фреймворк: React + Vite или Next.js (на твой выбор, но без SSR‑сложностей, достаточно SPA, если берёшь Vite/React).
- UI‑задача:
- Страница с формой загрузки PDF:
- поле выбора файла;
- выбор типа документа/шаблона (просто select с dummy‑значениями вроде "ГОСТ‑1", "ГОСТ‑2" — пока они только передаются на backend);
- кнопка «Отправить на обработку».
- Отображение списка задач:
- идентификатор задачи;
- имя исходного файла;
- статус (QUEUED / PROCESSING / DONE / ERROR);
- ссылка для скачивания результата, если есть DOCX.
- Простая страница деталей задачи (по id):
- метаданные;
- простой лог/ошибки, если были.
- Страница с формой загрузки PDF:
- Верстка может быть минимальной, без сложного дизайна, главное — чистая архитектура и удобство доработки.
Бизнес‑логика, которую нужно учесть
Цель системы: офисные сотрудники загружают PDF‑файл с технической документацией (ТЗ по ГОСТу и т.п.).
Backend:
-
Принимает PDF и создаёт “задачу обработки” в БД.
-
Сохраняет PDF в файловой системе (например, каталог
storage/input). -
Отправляет PDF в отдельный n8n‑workflow ИЛИ обрабатывает локально цепочкой шагов (сейчас — просто заглушка, позже я подвяжу n8n).
-
В перспективе pipeline будет такой:
- PDF → парсер (вытаскиваем текст/Markdown);
- Markdown → LLM (Qwen) → унифицированный JSON структуры документа;
- JSON + Word‑шаблон → генератор DOCX;
- результат сохраняем как DOCX в
storage/output. Но в рамках этого задания тебе нужно: - СДЕЛАТЬ кодовые заготовки для этих шагов (интерфейсы, классы, абстракции, контроллеры, DTO, сервисы),
- Реализовать «заглушки» (например, вместо реального вызова LLM и генератора DOCX возвращать фиктивный JSON/файл),
- Чётко показать точки интеграции, где я потом подключу реальную обработку.
-
Backend должен предоставлять API:
POST /api/jobs— загрузка PDF:- multipart/form-data, поле
file, опциональноtemplateType. - возвращает объект задачи
{ id, status, fileName, createdAt }.
- multipart/form-data, поле
GET /api/jobs— список задач (с пагинацией, query‑параметры).GET /api/jobs/:id— детальная информация о задаче, включая путь/URL к результату, лог ошибок.GET /api/jobs/:id/result— скачивание готового DOCX.GET /api/templates— список доступных Word‑шаблонов (backend должен сканировать папкуtemplates/и возвращать названия файлов / метаданные; сами .docx я положу вручную).POST /api/templates/reload— принудительное перечитывание списка шаблонов (на будущее).
-
Статусы задач:
- QUEUED, PROCESSING, DONE, ERROR.
- Нужен enum и таблица/модель
Jobс полями:- id (uuid),
- originalFileName,
- storedFilePath,
- resultFilePath (nullable),
- status,
- errorMessage (nullable),
- templateType (строка),
- createdAt, updatedAt.
-
Адаптер к LLM:
- Нужен отдельный сервис/модуль (например,
llm/llmClient.ts), который:- берёт на вход текст/markdown и возвращает JSON структуры документа (пока можно вернуть фиктивный JSON).
- конфигурируется через переменные окружения:
LLM_BASE_URL— URL OpenAI‑совместимого API (в будущем это будет адрес локального Qwen на сервере Ollama).LLM_API_KEY— токен для облачной модели (сейчас).LLM_MODEL— имя модели (например,gpt-4.1-miniили другое).
- Весь остальной код НЕ должен знать детали формата API конкретного поставщика, только использовать этот клиент/адаптер.
- Нужен отдельный сервис/модуль (например,
-
Адаптер генерации DOCX:
- Отдельный сервис (например,
docx/docxGenerator.ts), который:- принимает JSON структуры и имя шаблона;
- находит шаблон в папке
templates/(но сам шаблон не создаёт); - создаёт DOCX в
storage/output/<jobId>.docx.
- На этом этапе достаточно сделать заглушку:
- например, создать простой текстовый DOCX через любую
библиотеку (или даже временно создавать
.txtфайл, но оставить интерфейс и структуру под DOCX).
- например, создать простой текстовый DOCX через любую
библиотеку (или даже временно создавать
- Важно: предусмотреть удобное место, куда я положу свои .docx шаблоны, и в README описать, как они должны называться и как выбираются.
- Отдельный сервис (например,
Инфраструктура и структура проекта
Пожалуйста, СГЕНЕРИРУЙ и ОПИШИ:
-
Общая структура репозитория (monorepo или два отдельных проекта — opиши выбор). Пример, если это monorepo:
backend/frontend/docker/(общие конфиги)templates/(каталог для Word‑шаблонов)storage/input/(исходные PDF, .gitignore внутри)storage/output/(результирующие DOCX, .gitignore внутри)README.md.gitignoredocker-compose.yml
-
Файловая структура backend:
src/main.ts,src/app.module.ts(для Nest) или аналог для Express.- Модуль/пакет
jobs:- контроллер для API задач;
- сервис работы с задачами;
- DTO и entity/модель для БД.
- Модуль/пакет
files:- загрузка файлов;
- валидация типов;
- работа с путями хранения.
- Модуль/пакет
llm:- клиент для LLM;
- интерфейсы типов ответов.
- Модуль/пакет
docx:- генератор DOCX;
- адаптер к будущему шаблонизатору Docx (docxtemplater/Pandoc/и т.п.).
- Общий модуль
configдля работы с .env. - Конфиг Prisma/TypeORM и миграции для таблицы
Job.
-
Файловая структура frontend:
- Точка входа и маршрут
/с формой загрузки и списком задач. - Компоненты:
UploadFormJobsListJobDetails
- Сервис для общения с backend (например,
api/client.ts), где:- базовый URL API берётся из env (
VITE_API_BASE_URLи т.п.).
- базовый URL API берётся из env (
- Простая система типов TypeScript для сущностей Job и Template.
- Точка входа и маршрут
-
.gitignore:
- Исключить:
- node_modules,
- build‑артефакты,
- .env и другие секреты,
storage/input,storage/output,- временные файлы IDE.
- Исключить:
-
Docker:
Dockerfileдля backend.Dockerfileдля frontend.docker-compose.yml, который поднимает:backend(с зависимостью отdb);frontend;db(PostgreSQL);
- Переменные окружения для docker‑compose с примером (файл
.env.example).
-
README:
- Пошаговая инструкция:
- как установить зависимости;
- как запустить проект локально без Docker;
- как запустить через
docker-compose up; - как добавить новый Word‑шаблон (куда положить .docx, как он
подхватывается API
/api/templates).
- Пример запроса к API загрузки файла (curl).
- Краткое объяснение архитектуры:
- где слой LLM‑адаптера;
- где слой генерации DOCX;
- как в будущем подключить n8n и локальную Qwen.
- Пошаговая инструкция:
Формат ответа
Сформируй ответ в три части:
- Краткое текстовое объяснение архитектуры (2–3 абзаца).
- Подробная структура файлов/папок в формате дерева с комментариями.
- Основные файлы кода как СНИППЕТЫ:
docker-compose.yml;backend/Dockerfile,frontend/Dockerfile;- key‑файлы backend (main, контроллер задач, модель Job, LLM‑клиент, заглушка генератора DOCX);
- key‑файлы frontend (главная страница, клиент API);
.gitignore;.env.example;- выдержки из README с инструкциями.
Код можно не доводить до идеального продакшена, но он должен быть:
- компилируемым,
- структурированным,
- с понятными комментариями, что и где доработать, чтобы подключить реальную LLM и реальный генератор DOCX по шаблонам Word.
Не упрощай задачу: сгенерируй именно полноценный каркас проекта, как если бы ты начинал реальный коммерческий проект под эту задачу.