Краткая памятка для фронтенд-разработчика. IP-сессий шлёт backend LMS — здесь только browser SDK (/sdk.js).

1. Подключение один раз на layout

<script>
  window.KB2035AnomalyConfig = {
    enabled: true, // feature flag LMS
    apiBaseUrl: "https://anomaly.maximumtest.ru",
    sdkApiKey: "<SDK_API_KEY>", // выдаёт команда anomaly-service
  };
</script>
<script async src="https://anomaly.maximumtest.ru/sdk.js"></script>

Отключение: enabled: false или убрать <script src="…/sdk.js">.

2. State — держать актуальным

Объект не пересоздавать, только мутировать поля при навигации.

window.KB2035AnomalyState = {
  // обязательно для отправки событий
  studentId: "12345",
  studentName: "Иванов Иван",
  role: "student",

  // контекст курса (желательно)
  courseId: "python-basic-2026",
  courseTitle: "Python. Базовый уровень",
  groupId: "group-001",
  groupTitle: "Поток 1",
  moduleId: "module-1",
  moduleTitle: "Модуль 1",
  teacherId: "teacher-001",
  teacherName: "Петров Петр",

  // текущая страница
  pageType: "assignment", // assignment | test | lesson
  lessonId: null,
  lessonTitle: null,
  assignmentId: "task-001",
  assignmentTitle: "Практическое задание 1",
  testId: null,
  testTitle: null,
  questionId: null,
};

При переходе между страницами — обновляй поля:

window.KB2035AnomalyState.pageType = "test";
window.KB2035AnomalyState.testId = "test-001";
window.KB2035AnomalyState.testTitle = "Тест 1";
window.KB2035AnomalyState.assignmentId = null;
window.KB2035AnomalyState.assignmentTitle = null;
Приоритет контекста: аргумент метода → State → Config.

3. Что SDK делает сам вызывать не нужно

Что Когда
page_view при загрузке sdk.js
assignment_opened при загрузке SDK, если pageType === "assignment"
метрики (мышь, скролл, клавиатура, focus) автоматически
summary на сервер каждые 30 сек + при закрытии вкладки

4. Методы — когда вызывать явные вызовы

Все методы на window.KB2035Anomaly. Вызов безопасен через ?..

trackAssignmentSubmitted(payload?)

Когда: ученик нажал «Сдать задание», LMS получил результат.

window.KB2035Anomaly?.trackAssignmentSubmitted({
  success: true,  // если не передать — по умолчанию true
  score: 85,      // опционально
});

Поля assignmentId / assignmentTitle в payload — только если их ещё нет в State.

trackTestStarted(payload?)

Когда: ученик начал тест (кнопка «Начать», старт попытки).

window.KB2035Anomaly?.trackTestStarted();
// или явно:
window.KB2035Anomaly?.trackTestStarted({ testId: "test-001", testTitle: "Тест 1" });

trackAnswerSubmitted(payload?)

Когда: ученик отправил ответ на вопрос («Ответить» / «Далее»).

window.KB2035Anomaly?.trackAnswerSubmitted({ questionId: "q1" });

Вызывать на каждый ответ, не один раз в конце теста.
Опционально: isCorrect, difficulty, testId, testTitle.

trackAiAssistantRequest(payload?)

Когда: ученик отправил сообщение AI-помощнику.

window.KB2035Anomaly?.trackAiAssistantRequest({
  context: "lesson_help",
  topic: "циклы for",
});

flush()

Когда: нужно сразу отправить накопленные метрики (до 30-сек интервала).

await window.KB2035Anomaly?.flush();

Обычно не обязателен. Имеет смысл перед редиректом после сдачи теста/задания.

getContext()

Только для отладки — вернуть текущий контекст, который уйдёт в событие.

5. Сценарии по экранам

Экран LMS Обновить State Вызвать метод
Задание (открытие) pageType: "assignment", assignmentId, …
Задание (сдача) trackAssignmentSubmitted()
Тест (старт) pageType: "test", testId, … trackTestStarted()
Тест (ответ) questionId (опц.) trackAnswerSubmitted()
Урок / теория pageType: "lesson", lessonId, …
AI-чат trackAiAssistantRequest()

6. SPA (React / Vue без full reload)

  • page_view и assignment_opened уходят только при первой загрузке SDK.
  • При client-side навигации обязательно обновляй State на каждом роуте.
  • Отдельного метода «открыл задание» нет — для сдачи достаточно trackAssignmentSubmitted.
  • Для тестов явно вызывай trackTestStarted и trackAnswerSubmitted.

7. Чеклист

8. Проверка

Интерактивная проверка событий и summary: /sdk-test.html