Plan: Transitioning to Forward Deployed Engineer / AI Engineer
一份分阶段路线图,供后端工程师转向 FDE 与 AI Engineer 角色——解读头衔混乱、应用型 LLM 技术栈与面试循环。
AI 翻译
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 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 | «Что нового» |