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 | «Что нового» |