Plan: Transitioning to Forward Deployed Engineer / AI Engineer
백엔드 엔지니어가 FDE·AI 엔지니어로 전환하기 위한 단계별 로드맵
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗AI-платформа обучения и тестирования сотрудников Группы цифрового обслуживания по внутренним документам (Red Policy, Tone of Voice).
Репозиторий: https://github.com/jokhacom/final_project Сайт: https://final-project-lac-tau.vercel.app Статус: развёрнут на Vercel, база данных на Supabase, регистрация и вход работают.
Отдельный демо-проект (
trenaszer-test-1.vercel.app, репозиторийjokhacom/trenaszer-test) — это самостоятельная презентационная версия без базы данных. К основному проекту она не относится, из неё берётся только дизайн.
AIProvider: Gemini (есть бесплатный лимит), Claude (официальный SDK) и OpenAI. Промпты общие (src/lib/ai/prompts.ts). Основной провайдер — AI_PROVIDER, остальные с заданным ключом работают как запасные (src/lib/ai/index.ts)| Роль | Как получить | Доступ |
|---|---|---|
EMPLOYEE | Самостоятельная регистрация на главной странице | Тесты, личный кабинет, рейтинг |
ADMIN | Выдаёт суперадмин: «Админ» → «Обзор» → «Сотрудники» → роль «Администратор» | /admin/* |
SUPERADMIN | Логин javokhir, создаётся один раз через /api/setup/seed | Всё, включая управление материалами |
src/middleware.ts пускает на страницы только вошедших, а в /admin/* — только ADMIN и SUPERADMIN. API проверяет сессию сам (src/lib/session.ts): кто отвечает на тест, берётся из сессии, а не из тела запроса. Загрузка и анализ документов, генерация вопросов и настройки доступны только SUPERADMIN; банк вопросов, аналитика, выгрузка, обратная связь и «Что нового» — ADMIN и SUPERADMIN.
Код лежит в репозитории GitHub. Любой пуш в main запускает новую сборку на Vercel.
6543) → DATABASE_URL, в конце добавьте ?pgbouncer=true5432) → DIRECT_URLtenant/user not found или Can't reach database server, откройте проект в Supabase и нажмите Restore.prisma generate && prisma db push --accept-data-loss && next build
Так таблицы в базе создаются автоматически при каждой сборке (миграции не используются). Та же команда записана в package.json как скрипт vercel-build, поэтому Override можно и не включать.| Переменная | Назначение |
|---|---|
DATABASE_URL | Строка Transaction pooler (6543, ?pgbouncer=true) |
DIRECT_URL | Строка Session pooler (5432) |
NEXTAUTH_URL | Основной адрес сайта, например https://final-project-lac-tau.vercel.app |
NEXTAUTH_SECRET | Длинная случайная строка |
SETUP_SECRET | Секрет для одноразового создания суперадмина |
AI_PROVIDER | Основной ИИ: gemini, anthropic или openai |
GEMINI_API_KEY | Ключ Google AI Studio (есть бесплатный лимит). Модель — GEMINI_MODEL, по умолчанию gemini-2.5-flash |
ANTHROPIC_API_KEY | Ключ Claude API. Модель — ANTHROPIC_MODEL, по умолчанию claude-haiku-5-5 |
OPENAI_API_KEY | Ключ OpenAI. Модель — OPENAI_MODEL |
GRADING_MODE | Можно не задавать: если ключ ИИ есть — проверка через ИИ, если нет — по ключевым словам. keyword оставляет проверку без ИИ даже при наличии ключа |
SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASS, FEEDBACK_EMAIL | Пересылка обратной связи на почту (опционально, без них обращения видны в админ-панели) |
После изменения переменных нужен Redeploy (Deployments → ⋯ → Redeploy).
Откройте в браузере один раз:
https://<ваш-сайт>/api/setup/seed?secret=<SETUP_SECRET>&password=<новый пароль>
Будет создан суперадмин javokhir с указанным паролем. Повторный вызов ничего не изменит. Пароль потом можно сменить в «Кабинет» → «Сменить пароль».
Суперадмин в «Админ» → «Обзор» → «Сотрудники» может сменить роль (сотрудник / администратор), сбросить забытый пароль (🔑) и удалить сотрудника вместе с его результатами. Удалённый сотрудник сразу теряет доступ, смена роли действует без повторного входа. Суперадмина изменить или удалить нельзя.
Если при регистрации приходит
409, такой логин уже существует. Логин: 3–32 символа, латинские буквы, цифры,.,-,_.
Для теста нужно минимум 10 вопросов на уровень (лучше 5 с вариантами + 5 со свободным ответом). Пока вопросов не хватает, карточка уровня у сотрудников отмечена «Скоро». Что уже готово, видно в «Админ» → «Обзор» → «Готовность к запуску».
«Админ» → «Проверка»: открытые ответы сотрудников с уже поставленной автоматической оценкой (по ключевым словам, эталонному ответу или ИИ). Администратор подтверждает или исправляет её: верно/неверно, число орфографических и грамматических ошибок, комментарий. «Конфеты» попытки, рейтинг и достижения пересчитываются сразу, а сотрудник видит в разборе пометку «проверено» и комментарий. Сколько ответов ждут проверки, видно на «Обзоре».
Код менять не нужно — только переменные в Vercel и Redeploy. Рекомендуемая схема — бесплатный Gemini основным и Claude Haiku 5.5 запасным:
AI_PROVIDER=geminiGEMINI_API_KEY — ключ из Google AI StudioANTHROPIC_API_KEY — ключ из console.anthropic.com (запасной)Запрос сначала уходит в Gemini. Если он не ответил — закончился бесплатный лимит (429) или сбой — тот же запрос автоматически отправляется в Claude Haiku 5.5. После ответа «лимит исчерпан» Gemini 15 минут пропускается, потом сайт снова пробует его первым. Если не ответил никто, открытый ответ проверяется по ключевым словам, тест не ломается. Какая цепочка включена, видно в «Админ» → «Обзор». Можно указать только один ключ — тогда работает только этот провайдер.
После Redeploy сразу включатся: проверка открытых ответов по смыслу, орфографии и грамматике (−1 🍬 за ошибку), анализ документов в «Материалах», генерация и перегенерация вопросов. Без ИИ ответы проверяются по ключевым словам, орфография не учитывается.
npm install
cp .env.example .env # заполнить DATABASE_URL, DIRECT_URL, NEXTAUTH_SECRET, SETUP_SECRET
npx prisma db push
npm run dev
Цепочка источника: Document (Material) → Topic → Rule → Question.
Topic, Rule — ИИ читает документ и выделяет темы и правила (REQUIRED, FORBIDDEN, RECOMMENDED, EXAMPLE_GOOD, EXAMPLE_BAD) с цитатой источника.Material.version, supersedesId, isActive. Старые вопросы остаются привязаны к старой версии.MULTIPLE_CHOICE, OPEN, FIND_ERROR, FIX_MESSAGE, BEST_RESPONSE. Уровни: Новичок, Middle, Professional, EXAM. Итоговый экзамен (EXAM) — отдельное задание со своими вопросами: они не берутся из других уровней и не создаются автоматически (добавьте вручную, через Excel с уровнем «Экзамен» или кнопкой «+ Экзамен» у темы).Документ любого размера ИИ читает целиком: текст режется на части примерно по 8 000 символов (≈4 страницы, по границам абзацев, src/lib/parsing/chunks.ts), каждая часть разбирается отдельным запросом, темы с одинаковым названием из разных частей объединяются. Кнопка «🤖 Создать тесты» в «Материалах» делает всё сама: анализ всех частей → вопросы по каждой теме для трёх уровней (сколько на тему — задаётся, по умолчанию 4) с прогрессом на экране. Повторное нажатие создаёт только недостающие вопросы. Шаги идут из браузера по одному запросу к ИИ, поэтому не упираются в лимит времени функций Vercel; страницу нельзя закрывать, пока идёт обработка. Проверка открытого ответа опирается на правила темы вопроса, а не на начало документа.
Чтобы каждый запрос укладывался в 60 секунд функции Vercel, при разборе документа и создании вопросов/игр ИИ отвечает в быстром режиме (Gemini flash — без «размышлений», Claude — effort: low), а обрезанный ответ не теряется: сайт берёт все темы и вопросы, пришедшие целиком. Проверка ответов сотрудников идёт в обычном режиме.
Язык вопросов и игр выбирается в «Материалы» → «Настройки создания»: «Как в документе» (узбекский документ → узбекские вопросы, русский → русские), «Русский» или «Oʻzbekcha (lotin)». Узбекский текст ИИ пишет по правилам современной орфографии (как в словаре imlo.uz: oʻ, gʻ, ʼ). Темы и правила документа сохраняются на языке документа, комментарий к проверке открытого ответа — на языке ответа сотрудника. Интерфейс сайта пока только на русском.
Ограничения: файл до ~4 МБ (лимит запроса Vercel), PDF должен содержать текст, а не сканы.
Раздел «📖 Обучение» для сотрудников: готовые презентации и три игры для закрепления правил — «Можно или нельзя?» (реплика сотрудника клиенту: допустима ли она, с объяснением), «Найди и исправь ошибку» (скриншот чата или сообщение с ошибкой → сотрудник пишет исправленный вариант и сравнивает с правильным; конфеты не снимаются) и «Грамотность» (русский или узбекский язык — отдельными раундами: предлоги, окончания, суффиксы, слитно/раздельно, орфография, пунктуация, ударение; 10 вопросов, 10 секунд на каждый).
⌨️ Скорость печати (/typing, карточка в «Обучении») — тест в стиле monkeytype: русский, узбекский (oʻ, gʻ; апостроф ' засчитывается) и узбекский на новом алфавите (проект 2021 года: ó, ǵ, ş, ç — есть кнопки на экране). Режимы 15/30/60/120 с, скорость (слов в минуту), точность, личный рекорд и топ-10 (TypingResult).
«Грамотность» не зависит от документов: в «Админ» → «Обучение» → «Грамотность» есть кнопка «📚 Добавить готовые вопросы» (около 60 русских и 45 узбекских, src/lib/languageBank.ts; повторное нажатие не дублирует) и «🤖 Создать ИИ». Узбекские вопросы — по «Oʻzbek tilining asosiy imlo qoidalari» (oʻ, gʻ, tutuq belgisi ʼ). Любой вопрос можно добавить вручную, изменить или удалить. Старая игра «Карточки» убрана из интерфейса.
.pptx, .ppt) до 100 МБ. PDF открывается прямо на сайте, PowerPoint — через просмотрщик Microsoft Office (встроен в страницу). Можно переименовать и удалить.
BLOB_STORE_ID и BLOB_WEBHOOK_PUBLIC_KEY (вход без ключа), в старых — BLOB_READ_WRITE_TOKEN; сайт работает с обоими вариантами. Тип хранилища — Public. Браузер отправляет файл на сайт частями по 3 МБ (лимит запроса Vercel ~4,5 МБ), сайт собирает их и сохраняет в хранилище.| Эндпоинт | Что делает |
|---|---|
POST /api/materials/upload | Загрузка PDF/DOCX/TXT, извлечение текста |
POST /api/materials/[id]/analyze | ИИ строит темы и правила по одной части документа ({chunk}), {finalize:true} — завершить |
GET /api/materials/[id]/knowledge | Темы и правила документа |
POST /api/questions/generate | Генерация вопросов по теме или правилу |
POST /api/questions/manual | Ручное создание вопроса |
PATCH/DELETE /api/questions/[id] | Правка и удаление вопроса |
GET /api/questions/[id]/source | Цепочка вопрос → правило → тема → документ |
POST /api/attempts/start | Старт теста: случайные вопросы, 15 минут. Правильные ответы в браузер не отдаются |
POST /api/attempts/submit-mc | Ответ на вопрос с вариантами (MULTIPLE_CHOICE, BEST_RESPONSE) |
POST /api/grade | Проверка ответа своими словами (OPEN, FIND_ERROR, FIX_MESSAGE) |
POST /api/attempts/finish | Завершение теста: неотвеченные считаются неверными, конфеты, рейтинг, достижения, разбор |
GET /api/attempts/[id] | Результат и полный разбор завершённого теста |
/certificate/[attemptId] | Сертификат (более 90 «конфет»), сохраняется в PDF через печать. Старый GET /api/certificates/[attemptId] перенаправляет сюда |
GET /api/me | Личный кабинет текущего сотрудника |
GET /api/admin/users | Список сотрудников |
PATCH/DELETE /api/admin/users/[id] | Роль, сброс пароля, удаление (только суперадмин) |
POST /api/auth/change-password | Смена своего пароля (нужен текущий) |
GET /api/admin/review, PATCH /api/admin/review/[answerId] | Ручная проверка открытых ответов |
Дизайн реализован по описанию ниже: общие стили — src/app/globals.css, шапка — src/components/Header.tsx.
Стиль: игровой, «конфетный». Тёмная тема с фиолетовым фоном (#1B0B2E → #2A0F45) и светлая с нежно-розовым (#F6F0FF → #FDEBF3), переключатель тем. Шрифт Nunito. Кнопки и акценты — градиент фиолетовый → розовый (#7C4DFF → #FF6FA5). Заголовок «🍬 Тренажер знаний ГЦО», декоративные конфеты на фоне.
Цвета уровней:
| Уровень | Цвет |
|---|---|
| 🟢 Новичок | #00E5A0 |
| 🟡 Middle | #FFC93C |
| 🔴 Professional | #FF6FA5 |
| 🎓 Итоговый экзамен (KPI) | #7C4DFF |
Экраны:
Итоговые уровни результата:
| «Конфеты» | Результат |
|---|---|
| 95 и больше | Эксперт |
| 85–94 | Отлично |
| 70–84 | Хорошо |
| 50–69 | Нужно повторить материал |
| меньше 50 | Требуется обучение |
Правила подсчёта: максимум 100 «конфет», за неверный ответ −50/N (N — число вопросов в тесте: при 10 вопросах −5, при 20 — −2,5), −1 за орфографическую ошибку, −1 за грамматическую. Сертификат выдаётся при результате выше 90.
Достижения: например, «Эксперт ГЦО» 👑 — за 95 и больше «конфет» на уровне Professional.
Тексты вопросов: реальные кейсы из документов «Редполитика AVO» и «Редполитика для базы знаний» (задолженность, тарифы, хейт и т.п.), а не абстрактные формулировки.
ProtectedTextarea)WeakTopic/api/daily-quiz есть, отдельного экрана нет)Серверные функции Vercel работают в регионе sin1 (Сингапур, vercel.json) — рядом с базой Supabase (ap-southeast-1). Если база будет перенесена в другой регион, поменяйте regions на ближайший к ней (например fra1 для Франкфурта), иначе каждый запрос к базе будет идти через полмира.
| Симптом | Причина и решение |
|---|---|
Can't reach database server / tenant/user not found | Проект Supabase на паузе или неверный DATABASE_URL. Восстановите проект, проверьте строку и сделайте Redeploy |
Environment variable not found: DIRECT_URL | Переменная не добавлена или добавлена не в то окружение. Добавьте и сделайте Redeploy |
| Сборка идёт без создания таблиц | Не включён Override у Build Command |
Invalid URL на /_not-found | Не задан NEXTAUTH_URL |
404 на новой странице | Файл лежит не по пути src/app/..., либо открыт адрес старого деплоя. Используйте основной домен |
Регистрация возвращает 409 | Логин уже занят |
| Сайт медленно открывается | Регион функций Vercel далеко от базы — см. раздел «Скорость». Первый запрос после простоя всегда чуть дольше |
GET /api/admin/status | Готовность к запуску: вопросы по уровням, подключён ли ИИ |
GET/POST /api/questions/import | Шаблон Excel и импорт вопросов |
GET /api/levels | Какие уровни уже можно проходить |
GET /api/admin/export?userId=&from=&to= | Excel-выгрузка (один сотрудник или все) |
GET /api/admin/analytics | Аналитика для администратора |
GET /api/leaderboard | Рейтинг |
GET/POST /api/learning/presentations, GET/PATCH/DELETE /api/learning/presentations/[id] | Презентации (GET по id — сам PDF) |
GET/POST /api/learning/games, PATCH/DELETE /api/learning/games/[id] | Элементы игр (?kind= — раунд, ?all=1 — список для админа) |
POST /api/learning/games/generate | ИИ создаёт элементы игр по теме |
POST /api/feedback | Обратная связь |
GET/POST /api/changelog | «Что нового» |